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 :: Маршрутизация

 PHP.SU

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


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

> Описание: Помогите советом
Hapson
Отправлено: 12 Августа, 2013 - 18:17:21
Post Id



Посетитель


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


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

[+]


Всем привет!
Столкнулся я с небольшой проблемой.
Вобщем все пишу я свой блог. Структура примерно такова:
Есть папка с классами - каждый класс в отдельном файле. Классы подгружаются автолоадом.
Есть папка с модулями:
auth - авторизация и регистрация пользователей. Использует класс Users.
articles - отвечает за добавление и вывод статей. Использует класс Articles.
Ну и так далее...
Каждый модуль имеет свой класс. Есть еще и вспомогательные классы, например, класс для работы с БД, класс для различной обработки текста и прочие.
Теперь вот озадачился я написанием некоего маршрутизатора, который будет парсить адресную строку и подключать нужные модули. Вот тут у меня случился творческий ступор.
Читал я про MVC, но не очень понимаю, как его применить.
Модели - ну это наверное мои модули.
Представление и маршрутизация - это наверное модуль content и собственно маршрутизатор, который я все никак не могу написать.
Модуль content отвечает за вывод контента. Контент - это в первую очередь статьи. То есть модуль content использует модуль articles. Модуль content также использует модуль auth - выводит в область контента формы авторизации и регистрации.
То есть модуль content - это модуль, который по сути использует любые нужные ему модули, чтобы вывести какой-то контент.
Модуль content использует класс ContentRouter. В классе происходит разбор адресной строки и подключение нужных модулей. Класс только начал писать и умеет он пока мало.

В частности сейчас так:
http://exemple[dot]com/auth/autorized - подключается модуль авторизации и выводится форма авторизации
http://exemple[dot]com/auth/register - подключается модуль авторизации и выводится форма регистрации
Если просто
http://exemple[dot]com - подключается модуль articles, который выводит 5 последних статей в виде блога.

Вопрос в чем. Как сделать не http://exemple[dot]com/auth/register а просто http://exemple[dot]com/register

Сейчас у меня первое значение - это имя модуля, второе значение - это необходимое действие.


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



Участник


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


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




Hapson, я в своей системе сделал маршрутизацию по регулярным выражениям.
Можешь глянуть для примера: https://github[dot]com/Okula/dzsystem
 
 Top
Hapson
Отправлено: 12 Августа, 2013 - 20:08:23
Post Id



Посетитель


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


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

[+]


Okula
Смотрел-смотрел ваш код - слишком его много, ничего не понял.
Сейчас попробую поискать про регулярки


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



Участник


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


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




Hapson, там уже готовый каркас под новые приложения + шаблонизатор Twig.
В том коде есть тестовое приложение на которое и нужно обратить внимание, а особенно на класс роутер.
Обрати внимание на метод getLinkList() там и прописываются регулярные выражения для загрузки конкретной модели.
https://github[dot]com/Okula/dzsyste[dot][dot][dot]dules/Router.php
 
 Top
caballero
Отправлено: 12 Августа, 2013 - 20:34:01
Post Id


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


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


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




регулярка на самом деле нужна только для отправки запроса на index.php
дальше уже можно обрабатывать без всяких регулярок


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



Участник


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


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




caballero, зато у меня нет жёсткой привязки к файловой системе, полная свобода действия. Ссылки я могу формировать так как хочу. Передавать параметры в ссылке тоже любым образом.
 
 Top
caballero
Отправлено: 12 Августа, 2013 - 21:05:36
Post Id


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


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


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




Цитата:
caballero, зато у меня нет жёсткой привязки к файловой системе, полная свобода действия. Ссылки я могу формировать так как хочу. Передавать параметры в ссылке тоже любым образом.

не вижу связи с файловой системмой


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



Посетитель


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


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

[+]


Okula
Спасибо за ссылку на ваше творение, но увы - разобраться не могу.
Нет ли у вас на примете ссылок, где можно почитать про азы маршрутизации?
То что я написал больше похоже на банальный switch...case, хоть это и класс...
Короче опять у меня ступор. Огорчение


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


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


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


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




Цитата:
То что я написал больше похоже на банальный switch...case

и что?


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



Посетитель


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


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

[+]


caballero
caballero пишет:
и что?

Ну... это разве хорошо?
Все до чего я пока додумался - это разобрать адресную строку типа
http://exemple[dot]com/auth/register
Получится что-то типа:

Это делает класс ContentRouter
А в файлике модуля content я написал
PHP:
скопировать код в буфер обмена
  1. ContentRouter::start($_SERVER['REQUEST_URI']);


Короче в адресной строке появляется что-то... ну на данном этапе это имя модуля и действие. Это что-то ловит модуль content и передает в класс ContentRouter методу start.
Метод start разбирает адресную строку и подрубает модуль с нужным действием. Ну и выводит результат этого действия в область контента. В данном случае это форма регистрации.

Я уж думал делать в БД какую-то табличку. Ну типа если register, то это значит нужно запустить auth и выполнить register...

Однако! Все это нужно будет расширять. Появятся другие модули. Появится больше параметров в адресной строке. Уже сейчас вот хочется например убрать auth из адресной строки...
(Добавление)
Hapson пишет:
Метод start разбирает адресную строку и подрубает модуль с нужным действием. Ну и выводит результат этого действия в область контента

Точнее метод start подрубает модуль, указывает модулю на нужное действие, а модуль его выполняет и выводит на экран результат своей работы. Дальше этот модуль может продолжить взаимодействие с юзером при необходимости. (ну регистрация здесь или авторизация)
(Добавление)
Вот мой мега роутер ))) Это очень черный черновик

PHP:
скопировать код в буфер обмена
  1. class ContentRouter{
  2.         public $modul;
  3.         public $action;
  4.        
  5.         function start($data){
  6.                 $params = explode("/", $data);
  7.                 $router = array();
  8.                 foreach($params as $val){
  9.                         if(!empty($val)){
  10.                                 $router[] = trim($val);
  11.                         }
  12.                 }
  13.                 if(count($router) > 0){
  14.                         return include_once ROOT .'/mod/'. $router[0] .'/'. $router[1] .'.php';
  15.                 }else{
  16.                         return include_once ROOT .'/mod/articles/articles.php';
  17.                 }
  18.         }
  19. }


А это файлик модуля content

PHP:
скопировать код в буфер обмена
  1. ContentRouter::start($_SERVER['REQUEST_URI']);


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


Частый гость


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


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

[+]


 
 Top
Hapson
Отправлено: 12 Августа, 2013 - 22:03:47
Post Id



Посетитель


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


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

[+]


_Dark_
Спасибо.
Много видел похожего, но ваш пример как-то очень понятен.
Надо в этом направлении шевелить мозгами...


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


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


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


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




лично у меня все просто
все адресные строки которые не содержат ? & . и т.д. предназначены для роутера
RewriteRule ^(\/index\.php.{0,}|[-#a-zA-Z0-9\/_]+)$ /index.php [L,QSA]

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

это функция распознает "свои" маршруты и выполняет чего надо с этим выполнять)
если это не "свой" маршрут выполняется роутинг для следующего модуля


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



Участник


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


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




Hapson, а что именно тебе не понятно в моём каркасе?
В папке www лежит файл index.php который принимает и обрабатывает все запросы к сайту (единая точка входа).
Ну а в папке src нужно распологать своё приложение.
src/classes - там лежат все классы связанные с приложением. В принципе папка Test и есть папка с тестовым приложением.
В папке src/views лежат все файлы шаблоны шаблонизатора Twig (представление страниц).
В папке src/config все конфигурационные файлы.
 
 Top
digi
Отправлено: 13 Августа, 2013 - 10:09:00
Post Id


Посетитель


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


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




Hapson, попробуй http://symfony[dot]com/doc/current/c[dot][dot][dot]ntroduction[dot]html покрутить, штука очень удобная. также позволяет скомпилировать все маршруты в один пхпфайл и положить в кеш, откуда он будет забираться очень быстро Улыбка конфигурировать тоже можно по разному, самый удобочитаемый для человека вид это yaml.
 
 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