Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
А вот дальше. Как это происходит в самом приложении.
по разному в некоторриых случаях 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
сто вроде бы просто и логично но пиходится привязывтся к жесткой структуре
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
caballero
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.
А вот например избавиться от имени модуля в адресной строке, это уже через .htaccess нужно правильно?
PS
А в статьях я сразу предусмотрел поле alias, которое может быть сформировано на основе title или введено вручную.
Вот еще вопросец. Alias ведь желательно делать уникальным для всех статей? Во избежание накладок при возможной реорганизации структуры сайта. Так-то можно например иметь две статьи с одинаковым alias, но в разных категориях. А вот если будет реорганизация категорий... Или потом просто добавлять к.перед alias например id статьи.
Ну да ладно, это уже из другой оперы.
caballero
Спасибо. Вы меня опять натолкнули на путь истинный
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
esterio
Отправлено: 13 Августа, 2013 - 20:41:13
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Hapson пишет:
esterio
esterio пишет:
Во первых есть два вида роутинга:
- физическый - файловая система
- логический - конфиг
Также есть их гибриды.
Вот это вообще темный лес...
Что есть физический и логический? Можно в двух словах их принципы действия?
что тут обьяснять.
пусть есть файл TestController и он имеет метод actionIndex, тогда урл вида /test/index будет вызивать етот метод. Ет физическый.
Другой способ когда есть конфиг вида
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.
ничего ты не понял
нету никакого общего контроллера котрый парсит.
общий контролер (класс типа Application) перебирает модули и дергает фукцию роутинга в каждом
общему контролеру нет дела до того как модули организовывают адресную строку
если ни один модуль не обработал роутинг то выполнятся обычная адресация по дефолту
Цитата:
Alias ведь желательно делать уникальным для всех статей?
ну так название статьи как правило уникально.
так какие проблеммы
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
caballero
caballero пишет:
ничего ты не понял
нету никакого общего контроллера котрый парсит.
общий контролер (класс типа Application) перебирает модули и дергает фукцию роутинга в каждом
общему контролеру нет дела до того как модули организовывают адресную строку
если ни один модуль не обработал роутинг то выполнятся обычная адресация по дефолту
Ага.
То есть главный контроллер при старте дергает по-очереди все модули, а они уже пытаются что-то сделать с $_SERVER['RQUEST_URI'], правильно?
Теперь мне нужно писать для каждого модуля роутер, который будет парсить адр.строку.
Ну то есть модуль users знает, на что ему реагировать и как, то же с модулем articles и т.д.
Эмм.... а как перебрать попроще все роутеры модулей. Ну пусть это будет какая-то функция start() у каждого (Добавление)
caballero пишет:
ну так название статьи как правило уникально.
так какие проблеммы
Ну... не всегда. Я же не робот. Вот сегодня я захотел написать пост в свой блог и озаглавил его "Статья ни о чем". Через 3, 4, 6... месяцев у меня случился творческий ступор и я опять пишу "Статья ни о чем". Вторая статья никогда не будет выведена, если выборка по alias. (Добавление) esterio
Ага, теперь понятно. (Добавление)
PS
Главному контроллеру наверное нужно дать список модулей... наверное
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
caballero
Отправлено: 13 Августа, 2013 - 21:29:31
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Теперь мне нужно писать для каждого модуля роутер, который будет парсить адр.строку.
Ну то есть модуль users знает, на что ему реагировать и как, то же с модулем articles и т.д.
я не знаю что тебе нужно. я просто описал еще один вариант
Цитата:
Эмм.... а как перебрать попроще все роутеры модулей. Ну пусть это будет какая-то функция start() у каждого
примерно так
у меня модули лежат в отдельной папке у каждого есть файл с предопределенным именем и там предопределенные функции для роутинга , автолоада классов модуля, инициализации модуля и т.д.
Вобщем схема распространенная
Цитата:
Ну... не всегда. Я же не робот
твоя программа робот и может легко проверить уникальность алиаса
Цитата:
Главному контроллеру наверное нужно дать список модулей... наверное
да, это самый простой способ. Или он может сканировать папку с модулями (как в симфони и некоторых других решениях)
Это не принципиально - у тебя не будет каждый день добавлятся стопицот модулей
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
caballero пишет:
примерно так
у меня модули лежат в отдельной папке у каждого есть файл с предопределенным именем и там предопределенные функции для роутинга , автолоада классов модуля, инициализации модуля и т.д.
Вобщем схема распространенная
Ну да, у меня примерно так.
Есть общая папка с модулями - каждый модуль лежит в своей папке.
Есть папка с классами.
Автолоад подключен в самом начале.
Причем у меня модули как-бы используют классы. А классы все лежат в одной папке. Ну например модуль users использует класс Users, модуль articles использует Articles.
caballero пишет:
да, это самый простой способ. Или он может сканировать папку с модулями (как в симфони и некоторых других решениях)
Это не принципиально - у тебя не будет каждый день добавлятся стопицот модулей
Да - это верно. Модули - сущности относительно постоянные. Наверное имеет смысл записать список модулей. Есть у меня класс ModController, который пока еще практически ничего не делает. В его задачи сейчас входит подключение включенных модулей. Наверное надо нагрузить его еще чем-нибудь...
caballero пишет:
твоя программа робот и может легко проверить уникальность алиаса
Ну это само-собой. Так я и сделал.
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
caballero
Отправлено: 13 Августа, 2013 - 21:43:33
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Ну например модуль users использует класс Users, модуль articles использует Articles.
вообще то следует использовать namespace чтобы не сваливать функциональность модуля в один класс
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
Ch_chov
Отправлено: 14 Августа, 2013 - 05:44:43
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Задача значительно упросится, если использовать на сайте однотипный урлы (article/123, page/about и т.д.). В этом случае не нужно будет при каждом запросе опрашивать все модули. Можно будет это сделать один раз, например при включении/выключении модуля, при сбросе кэша и т.д. Записывать все маршруты в одну таблицу или конфигурационный файл, и потом одним запросом извлекать оттуда контроллер для текущего url.
Если url содержит get переменные, то они обрабатываются непосредственно в контроллере модуля.
Т.е. для фронтконтроллера url content/articles?page=1 и content/articles одно и то же.
Или используйте готовые решения. Например, компонент роутер из симфони. Его можно использовать отдельно от симфони.
http://symfony[dot]com/doc/current/components/routing/introduction.html
Hapson
Отправлено: 14 Августа, 2013 - 17:37:53
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Ch_chov
Да, в вашей мысли тоже что-то есть. Мне кажется что дергание всех модулей может замедлить процесс. Хотя нужно пробовать.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.