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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Маршрутизация [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Помогите советом
caballero
Отправлено: 13 Августа, 2013 - 19:24:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 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
сто вроде бы просто и логично но пиходится привязывтся к жесткой структуре

(Отредактировано автором: 13 Августа, 2013 - 19:27:39)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 13 Августа, 2013 - 19:56:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.
А вот например избавиться от имени модуля в адресной строке, это уже через .htaccess нужно правильно?

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

caballero
Спасибо. Вы меня опять натолкнули на путь истинный Улыбка


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
esterio
Отправлено: 13 Августа, 2013 - 20:41:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Hapson пишет:
esterio
esterio пишет:
Во первых есть два вида роутинга:
- физическый - файловая система
- логический - конфиг

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

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


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

Это логический.
 
 Top
caballero
Отправлено: 13 Августа, 2013 - 20:41:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ну вобщем понятно вроде. Некий общий контроллер парсит строку, разбирает ее по "/" и далее контроллеры модулей ищут "свое" в этой распарсенной строке. Ну да, как-то так я и хотел.

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

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

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

ну так название статьи как правило уникально.
так какие проблеммы

(Отредактировано автором: 13 Августа, 2013 - 20:42:02)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 13 Августа, 2013 - 20:58:11
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero
caballero пишет:
ничего ты не понял

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

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

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

Ну... не всегда. Я же не робот. Вот сегодня я захотел написать пост в свой блог и озаглавил его "Статья ни о чем". Через 3, 4, 6... месяцев у меня случился творческий ступор и я опять пишу "Статья ни о чем". Вторая статья никогда не будет выведена, если выборка по alias.
(Добавление)
esterio
Ага, теперь понятно.
(Добавление)
PS
Главному контроллеру наверное нужно дать список модулей... наверное


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 13 Августа, 2013 - 21:29:31
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Теперь мне нужно писать для каждого модуля роутер, который будет парсить адр.строку.
Ну то есть модуль users знает, на что ему реагировать и как, то же с модулем articles и т.д.

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

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

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

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

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

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

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 13 Августа, 2013 - 21:37:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


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

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

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


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

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


Ну это само-собой. Так я и сделал.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 13 Августа, 2013 - 21:43:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ну например модуль users использует класс Users, модуль articles использует Articles.

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 13 Августа, 2013 - 21:45:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
Цитата:
Ну например модуль users использует класс Users, модуль articles использует Articles.

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

Это как?
(Добавление)
PS
http://php.net/manual/ru/language.namespaces.php
это?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Ch_chov
Отправлено: 14 Августа, 2013 - 05:44:43
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 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
 
 Top
Hapson
Отправлено: 14 Августа, 2013 - 17:37:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Ch_chov
Да, в вашей мысли тоже что-то есть. Мне кажется что дергание всех модулей может замедлить процесс. Хотя нужно пробовать.

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


Это я как бы замеряю, за сколько происходит загрузка страницы.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Okula
Отправлено: 14 Августа, 2013 - 18:25:26
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Hapson, только пиши microtime(TRUE); конечно единица тоже = TRUE, но входной аргумент у функции в формате bool.
 
 Top
Hapson
Отправлено: 14 Августа, 2013 - 18:30:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Okula пишет:
Hapson, только пиши microtime(TRUE); конечно единица тоже = TRUE, но входной аргумент у функции в формате bool.

Ага, понятно. А 0,03 это много или мало. За это время подгружаются два модуля и выбираются 5 статей из БД.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Okula
Отправлено: 14 Августа, 2013 - 18:58:30
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Hapson, зависит от железа и от качества кода.
 
 Top
_Dark_
Отправлено: 14 Августа, 2013 - 21:17:42
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


Hapson пишет:
Ага, понятно. А 0,03 это много или мало. За это время подгружаются два модуля и выбираются 5 статей из БД.

А как вы думаете?
Считайте порогом 0.3 секунды.
 
 Top
Страниц (4): « 1 2 [3] 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB