Всем привет!
Столкнулся я с небольшой проблемой.
Вобщем все пишу я свой блог. Структура примерно такова:
Есть папка с классами - каждый класс в отдельном файле. Классы подгружаются автолоадом.
Есть папка с модулями:
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
Сейчас у меня первое значение - это имя модуля, второе значение - это необходимое действие.
1. Hapson - 12 Августа, 2013 - 18:17:21 - перейти к сообщению
2. Okula - 12 Августа, 2013 - 19:00:38 - перейти к сообщению
Hapson, я в своей системе сделал маршрутизацию по регулярным выражениям.
Можешь глянуть для примера: https://github[dot]com/Okula/dzsystem
Можешь глянуть для примера: https://github[dot]com/Okula/dzsystem
3. Hapson - 12 Августа, 2013 - 20:08:23 - перейти к сообщению
Okula
Смотрел-смотрел ваш код - слишком его много, ничего не понял.
Сейчас попробую поискать про регулярки
Смотрел-смотрел ваш код - слишком его много, ничего не понял.
Сейчас попробую поискать про регулярки
4. Okula - 12 Августа, 2013 - 20:17:49 - перейти к сообщению
Hapson, там уже готовый каркас под новые приложения + шаблонизатор Twig.
В том коде есть тестовое приложение на которое и нужно обратить внимание, а особенно на класс роутер.
Обрати внимание на метод getLinkList() там и прописываются регулярные выражения для загрузки конкретной модели.
https://github[dot]com/Okula/dzsyste[dot][dot][dot]dules/Router.php
В том коде есть тестовое приложение на которое и нужно обратить внимание, а особенно на класс роутер.
Обрати внимание на метод getLinkList() там и прописываются регулярные выражения для загрузки конкретной модели.
https://github[dot]com/Okula/dzsyste[dot][dot][dot]dules/Router.php
5. caballero - 12 Августа, 2013 - 20:34:01 - перейти к сообщению
регулярка на самом деле нужна только для отправки запроса на index.php
дальше уже можно обрабатывать без всяких регулярок
дальше уже можно обрабатывать без всяких регулярок
6. Okula - 12 Августа, 2013 - 20:56:18 - перейти к сообщению
caballero, зато у меня нет жёсткой привязки к файловой системе, полная свобода действия. Ссылки я могу формировать так как хочу. Передавать параметры в ссылке тоже любым образом.
7. caballero - 12 Августа, 2013 - 21:05:36 - перейти к сообщению
Цитата:
caballero, зато у меня нет жёсткой привязки к файловой системе, полная свобода действия. Ссылки я могу формировать так как хочу. Передавать параметры в ссылке тоже любым образом.
не вижу связи с файловой системмой
8. Hapson - 12 Августа, 2013 - 21:06:01 - перейти к сообщению
Okula
Спасибо за ссылку на ваше творение, но увы - разобраться не могу.
Нет ли у вас на примете ссылок, где можно почитать про азы маршрутизации?
То что я написал больше похоже на банальный switch...case, хоть это и класс...
Короче опять у меня ступор.
Спасибо за ссылку на ваше творение, но увы - разобраться не могу.
Нет ли у вас на примете ссылок, где можно почитать про азы маршрутизации?
То что я написал больше похоже на банальный switch...case, хоть это и класс...
Короче опять у меня ступор.
9. caballero - 12 Августа, 2013 - 21:22:08 - перейти к сообщению
Цитата:
То что я написал больше похоже на банальный switch...case
и что?
10. Hapson - 12 Августа, 2013 - 21:34:52 - перейти к сообщению
caballero
Ну... это разве хорошо?
Все до чего я пока додумался - это разобрать адресную строку типа
http://exemple[dot]com/auth/register
Получится что-то типа:
caballero пишет:
и что?
Ну... это разве хорошо?
Все до чего я пока додумался - это разобрать адресную строку типа
http://exemple[dot]com/auth/register
Получится что-то типа:
Это делает класс ContentRouter
А в файлике модуля content я написал
Короче в адресной строке появляется что-то... ну на данном этапе это имя модуля и действие. Это что-то ловит модуль content и передает в класс ContentRouter методу start.
Метод start разбирает адресную строку и подрубает модуль с нужным действием. Ну и выводит результат этого действия в область контента. В данном случае это форма регистрации.
Я уж думал делать в БД какую-то табличку. Ну типа если register, то это значит нужно запустить auth и выполнить register...
Однако! Все это нужно будет расширять. Появятся другие модули. Появится больше параметров в адресной строке. Уже сейчас вот хочется например убрать auth из адресной строки...
(Добавление)
Hapson пишет:
Метод start разбирает адресную строку и подрубает модуль с нужным действием. Ну и выводит результат этого действия в область контента
Точнее метод start подрубает модуль, указывает модулю на нужное действие, а модуль его выполняет и выводит на экран результат своей работы. Дальше этот модуль может продолжить взаимодействие с юзером при необходимости. (ну регистрация здесь или авторизация)
(Добавление)
Вот мой мега роутер ))) Это очень черный черновик
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- class ContentRouter{
- public $modul;
- public $action;
- function start($data){
- foreach($params as $val){
- }
- }
- return include_once ROOT .'/mod/'. $router[0] .'/'. $router[1] .'.php';
- }else{
- return include_once ROOT .'/mod/articles/articles.php';
- }
- }
- }