3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
1 | |
Как написать адекватный маршрутизатор на php26.11.2014, 22:26. Показов 4593. Ответов 22
Метки нет (Все метки)
Сейчас разбираюсь в некоторых деталях php, в том числе и организации маршрутизатора.
В .htaccess переадресую все на Index.php, где подключаю автозагрузчик, который подключает и запускает роутер. Пока идея такая: 1. Берем uri 2. Проверяем uri по базе, выявляем id и тип материала и запускаем соответствующий контроллер с нужными параметрами. Просьба посоветовать, как еще можно организовать роутер и обозначить несовершенства такой схемы. Как это обычно работает в современных CMS.
1
|
26.11.2014, 22:26 | |
Ответы с готовыми решениями:
22
нужно написать простой php скрипт или расказать как его написать php токо учю на примерах Как преобразовать картинку чтобы получить адекватный вектор входных данных для нейронной сети? [Unity, лайфхак] Как сделать адекватный синглтон (singleton или уникальный для сцены) компонент Маршрутизатор не видит другой маршрутизатор |
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
27.11.2014, 06:49 | 2 |
1) Получаем URL.
2) Разбиваем URL по слешу с помощью explode. 3) Вырезаем из получившегося массива первый элемент (это название класса контроллера). 4) Смотрим, есть ли файл с таким контроллером с помощью file_exists() (файлы именовать можно так, чтобы название файла соответствовало содержащемуся там классу). 5) Если файла нет - ошибка 404. Если есть - создаём экземпляр класса контроллера. 6) Вырезаем из получившегося массива второй элемент (это название метода контроллера). 7) Смотрим, есть ли такой метод в классе с помощью method_exists(). 8) Если метода нет - ошибка 404. Если есть, то вызываем его и передаём в качестве аргумента оставшийся массив. 9) В методе уже проверяем, передан ли в массиве ID. Если нет (а он был обязателен) - ошибка 404. Если не обязателен - действуйте по усмотрению.
0
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
27.11.2014, 17:57 [ТС] | 3 |
по такому типу уже писал роутеры, но к сожалению не решает нужную задачу, спасибо.
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
27.11.2014, 18:10 | 4 |
Т.е. Вы хотите, чтобы все URL хранились в базе и при переходе по ссылке, проверялось, есть ли в базе такой url? Интересная схема...
0
|
Software Developer
287 / 247 / 52
Регистрация: 23.09.2014
Сообщений: 823
|
|
27.11.2014, 21:09 | 5 |
1
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
28.11.2014, 13:58 [ТС] | 6 |
это для фронтенда, а для админке как раз сделал по описаной схеме
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
28.11.2014, 14:48 | 7 |
0
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
28.11.2014, 14:53 [ТС] | 8 |
можно по подробнее почему? а как тогда вместе с ЧПУ таким образом по вашей схеме сделать. Ведь название статьи может быть и такое "Как написать парсер на php", соответственно алиас будет следующий - kak-napisatj-parser-na-php, как мне такое реализовать при описанном вами подходе?
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
28.11.2014, 15:02 | 9 |
Сообщение было отмечено mrseo как решение
Решение
mrseo, я не про alias говорю , а говорю, что сначала в URL передаём контроллер, затем метод контроллера (его можно опустить при желании и использовать метод по умолчанию), а только затем alias. А вот этот alias уже по БД проверять, есть ли он или нет. Но весь URL в БД хранить не надо.
2
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
29.11.2014, 10:55 [ТС] | 10 |
теперь сохраняю только алиас, но вот перед проверкой значения, берущегося из uri строки в базе как стоит проверить или обработать строку?
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
||||||
29.11.2014, 11:42 | 11 | |||||
mrseo, можно не обрабатывать специально этот alias, а просто использовать подготовленные запросы. Пример с PDO:
Добавлено через 55 секунд В таком случае никакой sql-инъекции провести не удастся.
0
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
29.11.2014, 13:04 [ТС] | 12 |
отлично, у меня в работе с бд как раз использую PDO, и в модели уже написан метод с подобным запросом, только без привязке, немножко переделаю, тогда еще 1 вопрос, если можно. А к примеру когда я с админки сохраняю также данные в базе при помощи PDO, привязку стоит делать.
И еще можно уточнить как именно этот вариант не дает sql инъекциям пролезть, благодаря использованию рпивзяки с флагом PDO::PARAM_STR ?
0
|
Software Developer
287 / 247 / 52
Регистрация: 23.09.2014
Сообщений: 823
|
||||||
29.11.2014, 14:08 | 13 | |||||
Используй безымянные плейсхолдеры вместо именных и не мучайся.
1
|
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
|
|
29.11.2014, 15:37 [ТС] | 14 |
спасибо, просто мой вопрос был именно в том, как именно здесь происходит защита от инъекций, благодаря чем, получается благодаря тому, что сначала подготавливаем запрос?
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
29.11.2014, 17:19 | 15 |
mrseo, мы же напрямую не вставляем полученные данные в запрос, следовательно даже если будут там неэкранированные символы - не страшно. Ведь PDOStatement реализует всё за Вас.
Добавлено через 1 минуту Custos, я тоже хотел с начала так написать, но решил показать пример поподробнее . Может зря, а может и нет.
1
|
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
|
|
03.12.2014, 15:26 | 16 |
А почему весь url хранить в базе плохая идея? Ведь, если ЧПУ, то перед alias в ссылке наименование раздела, а не контроллера, а в разделе сайта могут быть различного типа материалы, да и alias теоретически может быть одинаковый, а разделы и страницы разные.
Объясните, пожалуйста, почему неправильно отсылать к контроллеру по полному url. Буду очень признательна за разъяснения. Спасибо!
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
03.12.2014, 15:56 | 17 |
Ну в MVC обычно и используют ЧПУ. Сначала идёт имя контроллера (оно же имя раздела, если хотите), потом метод (хотя метод можно и опустить и использовать метод по умолчанию).
Вы имеете в виду, что храниться все данные для всех разделов будут в одной таблице? Обычно одна таблица для одного контроллера (вернее модели). Простите, сейчас я сильно занят. Завтра утром может попробую объяснить.
1
|
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
|
|
03.12.2014, 16:02 | 18 |
lyod, спасибо. Буду ждать
0
|
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
|
|
09.12.2014, 16:02 | 19 |
lyod, прощу прощение за беспокойство Но, если у Вас появилось время, могли бы Вы внести ясность в вопрос выше?
Спасибо!
0
|
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
|
|
11.12.2014, 13:49 | 20 |
Потому что при использовании такого подхода будет не MVC, а неизвестный шаблон проектирования . Если Вы хотите писать, используя MVC, то нужно придерживаться стандартов этого шаблона приложения.
Потом, ситуаций может быть масса всяких разных. А если приложение разрастётся сильно? База же разрастётся до невероятных размеров, если каждый существующий url туда писать.
1
|
11.12.2014, 13:49 | |
11.12.2014, 13:49 | |
Помогаю со студенческими работами здесь
20
Как написать на PHP Как написать программу на php? Как написать код php Как написать маршрутизацию PHP? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |