Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Маршрутизация [3]
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Маршрутизация

Страниц (4): « 1 2 [3] 4 »
 

31. caballero - 13 Августа, 2013 - 19:24:06 - перейти к сообщению
Цитата:
А вот дальше. Как это происходит в самом приложении.

по разному в некоторриых случаях switch
в некотрых случая програмно
обычной функцией explode


Цитата:
То есть по сути, есть один общий роутер (или маршрутизатор...) и у каждого модуля есть собственный роутер, так?


простой регуляркой в .htaccess все перебрасывается на index.php
а там уже проще

каждый модуль имеет фкункцию с одинаковым именем
например route()
в index.php дергаются по очереди все функции каждого модуля
если какой то распознал свой url он выполняет что нужно в соответствии с реализацией - загружает какую то страницу, передает управление какому то контроллеру или делает внутренний редирект

примерно так

програмны роутинг более гибок
например у меня модуль статьи
кроме обычного адреса с index.php может быть адрес типа
/articles/234
роутер по слову articles (это имя модуля) распознает что это его и выводит статью 234
кроме того в форме редактировании статьи есть поле seo
туда редактор может вбить что то типа novаja_versija_php
поскольку роутер програмный то он еще и глянет в БД
и найдет статью по этому слову если таковое задано
то есть url может быть не только
/articles/234
а и
/novаja_versija_php

то есть каждый моуль сам решет как формировать URL и как их потом роутить
поэтому нет необходимости городить какой то общий алгоритм а потом писать стопицот регулярок

в MVC фреймворках обычно используется однообразный стиль
/controller/action/id
сто вроде бы просто и логично но пиходится привязывтся к жесткой структуре
32. Hapson - 13 Августа, 2013 - 19:56:15 - перейти к сообщению
caballero
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.
А вот например избавиться от имени модуля в адресной строке, это уже через .htaccess нужно правильно?

PS
А в статьях я сразу предусмотрел поле alias, которое может быть сформировано на основе title или введено вручную.
Вот еще вопросец. Alias ведь желательно делать уникальным для всех статей? Во избежание накладок при возможной реорганизации структуры сайта. Так-то можно например иметь две статьи с одинаковым alias, но в разных категориях. А вот если будет реорганизация категорий... Или потом просто добавлять к.перед alias например id статьи.
Ну да ладно, это уже из другой оперы.

caballero
Спасибо. Вы меня опять натолкнули на путь истинный Улыбка
33. esterio - 13 Августа, 2013 - 20:41:13 - перейти к сообщению
Hapson пишет:
esterio
esterio пишет:
Во первых есть два вида роутинга:
- физическый - файловая система
- логический - конфиг

Также есть их гибриды.

Вот это вообще темный лес...
Что есть физический и логический? Можно в двух словах их принципы действия?


что тут обьяснять.
пусть есть файл TestController и он имеет метод actionIndex, тогда урл вида /test/index будет вызивать етот метод. Ет физическый.
Другой способ когда есть конфиг вида
Цитата:
'/test/index' => array('controller' => 'test', 'action' => 'index')

Это логический.
34. caballero - 13 Августа, 2013 - 20:41:42 - перейти к сообщению
Цитата:
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.

ничего ты не понял

нету никакого общего контроллера котрый парсит.
общий контролер (класс типа Application) перебирает модули и дергает фукцию роутинга в каждом
общему контролеру нет дела до того как модули организовывают адресную строку
если ни один модуль не обработал роутинг то выполнятся обычная адресация по дефолту

Цитата:
Alias ведь желательно делать уникальным для всех статей?

ну так название статьи как правило уникально.
так какие проблеммы
35. Hapson - 13 Августа, 2013 - 20:58:11 - перейти к сообщению
caballero
caballero пишет:
ничего ты не понял

нету никакого общего контроллера котрый парсит.
общий контролер (класс типа Application) перебирает модули и дергает фукцию роутинга в каждом
общему контролеру нет дела до того как модули организовывают адресную строку
если ни один модуль не обработал роутинг то выполнятся обычная адресация по дефолту

Ага.
То есть главный контроллер при старте дергает по-очереди все модули, а они уже пытаются что-то сделать с $_SERVER['RQUEST_URI'], правильно?
Теперь мне нужно писать для каждого модуля роутер, который будет парсить адр.строку.
Ну то есть модуль users знает, на что ему реагировать и как, то же с модулем articles и т.д.

Эмм.... а как перебрать попроще все роутеры модулей. Ну пусть это будет какая-то функция start() у каждого
(Добавление)
caballero пишет:
ну так название статьи как правило уникально.
так какие проблеммы

Ну... не всегда. Я же не робот. Вот сегодня я захотел написать пост в свой блог и озаглавил его "Статья ни о чем". Через 3, 4, 6... месяцев у меня случился творческий ступор и я опять пишу "Статья ни о чем". Вторая статья никогда не будет выведена, если выборка по alias.
(Добавление)
esterio
Ага, теперь понятно.
(Добавление)
PS
Главному контроллеру наверное нужно дать список модулей... наверное
36. caballero - 13 Августа, 2013 - 21:29:31 - перейти к сообщению
Цитата:
Теперь мне нужно писать для каждого модуля роутер, который будет парсить адр.строку.
Ну то есть модуль users знает, на что ему реагировать и как, то же с модулем articles и т.д.

я не знаю что тебе нужно. я просто описал еще один вариант

Цитата:
Эмм.... а как перебрать попроще все роутеры модулей. Ну пусть это будет какая-то функция start() у каждого

примерно так
у меня модули лежат в отдельной папке у каждого есть файл с предопределенным именем и там предопределенные функции для роутинга , автолоада классов модуля, инициализации модуля и т.д.
Вобщем схема распространенная

Цитата:
Ну... не всегда. Я же не робот

твоя программа робот и может легко проверить уникальность алиаса

Цитата:
Главному контроллеру наверное нужно дать список модулей... наверное

да, это самый простой способ. Или он может сканировать папку с модулями (как в симфони и некоторых других решениях)
Это не принципиально - у тебя не будет каждый день добавлятся стопицот модулей
37. Hapson - 13 Августа, 2013 - 21:37:08 - перейти к сообщению
caballero пишет:
примерно так
у меня модули лежат в отдельной папке у каждого есть файл с предопределенным именем и там предопределенные функции для роутинга , автолоада классов модуля, инициализации модуля и т.д.
Вобщем схема распространенная

Ну да, у меня примерно так.
Есть общая папка с модулями - каждый модуль лежит в своей папке.
Есть папка с классами.
Автолоад подключен в самом начале.
Причем у меня модули как-бы используют классы. А классы все лежат в одной папке. Ну например модуль users использует класс Users, модуль articles использует Articles.

caballero пишет:
да, это самый простой способ. Или он может сканировать папку с модулями (как в симфони и некоторых других решениях)
Это не принципиально - у тебя не будет каждый день добавлятся стопицот модулей


Да - это верно. Модули - сущности относительно постоянные. Наверное имеет смысл записать список модулей. Есть у меня класс ModController, который пока еще практически ничего не делает. В его задачи сейчас входит подключение включенных модулей. Наверное надо нагрузить его еще чем-нибудь...

caballero пишет:
твоя программа робот и может легко проверить уникальность алиаса


Ну это само-собой. Так я и сделал.
38. caballero - 13 Августа, 2013 - 21:43:33 - перейти к сообщению
Цитата:
Ну например модуль users использует класс Users, модуль articles использует Articles.

вообще то следует использовать namespace чтобы не сваливать функциональность модуля в один класс
39. Hapson - 13 Августа, 2013 - 21:45:17 - перейти к сообщению
caballero пишет:
Цитата:
Ну например модуль users использует класс Users, модуль articles использует Articles.

вообще то следует использовать namespace чтобы не сваливать функциональность модуля в один класс

Это как?
(Добавление)
PS
http://php.net/manual/ru/language.namespaces.php
это?
40. Ch_chov - 14 Августа, 2013 - 05:44:43 - перейти к сообщению
Задача значительно упросится, если использовать на сайте однотипный урлы (article/123, page/about и т.д.). В этом случае не нужно будет при каждом запросе опрашивать все модули. Можно будет это сделать один раз, например при включении/выключении модуля, при сбросе кэша и т.д. Записывать все маршруты в одну таблицу или конфигурационный файл, и потом одним запросом извлекать оттуда контроллер для текущего url.

Если url содержит get переменные, то они обрабатываются непосредственно в контроллере модуля.
Т.е. для фронтконтроллера url content/articles?page=1 и content/articles одно и то же.

Или используйте готовые решения. Например, компонент роутер из симфони. Его можно использовать отдельно от симфони.
http://symfony[dot]com/doc/current/components/routing/introduction.html
41. Hapson - 14 Августа, 2013 - 17:37:53 - перейти к сообщению
Ch_chov
Да, в вашей мысли тоже что-то есть. Мне кажется что дергание всех модулей может замедлить процесс. Хотя нужно пробовать.

Кстати, насчет скорости. Правильно ли я сделал:
PHP:
скопировать код в буфер обмена
  1.  
  2. //В самом начале написал
  3. $start = microtime(1);
  4. //а в самом конце, то есть после загрузки шаблона
  5. echo 'Страница сгенерирована за : '. (microtime(1)-$start) .' сек.';


Это я как бы замеряю, за сколько происходит загрузка страницы.
42. Okula - 14 Августа, 2013 - 18:25:26 - перейти к сообщению
Hapson, только пиши microtime(TRUE); конечно единица тоже = TRUE, но входной аргумент у функции в формате bool.
43. Hapson - 14 Августа, 2013 - 18:30:48 - перейти к сообщению
Okula пишет:
Hapson, только пиши microtime(TRUE); конечно единица тоже = TRUE, но входной аргумент у функции в формате bool.

Ага, понятно. А 0,03 это много или мало. За это время подгружаются два модуля и выбираются 5 статей из БД.
44. Okula - 14 Августа, 2013 - 18:58:30 - перейти к сообщению
Hapson, зависит от железа и от качества кода.
45. _Dark_ - 14 Августа, 2013 - 21:17:42 - перейти к сообщению
Hapson пишет:
Ага, понятно. А 0,03 это много или мало. За это время подгружаются два модуля и выбираются 5 статей из БД.

А как вы думаете?
Считайте порогом 0.3 секунды.

 

Powered by ExBB FM 1.0 RC1