Как корректно обработать строку запроса типа catalog/aloe/aaaa, если третий параметр в роутинге не предусмотрен (только /)?
Всем доброго времени суток.
Решил написать простенький сайт на php, придерживаясь MVC. Роутинг организовал следующим образом:
1. Первым делом получаю строку запроса: если она заканчивается на слеш (и если это не корень), перенаправляю на эту же страницу без слеша
Скриншот фрагмента кода удалён модератором.
2. Разбиваю строку на массив, из первого параметра получаю имя контроллера и создаю соответствующий экземпляр. Если нет второго параметра, вызываю действие по умолчанию: на сайте это отобразить каталог, или страницу со сатьями (uri соответственно mysite.com/catalog или mysite.com/articles). Если же есть второй параметр (это название конкретного растения или id статьи), вызываю другое действие и передаю параметр (получается mysite.com/catalog/aloe)
Скриншот фрагмента кода удалён модератором.
Решил проблему некорректных запросов типа mysite.com/catalogg и mysite.com/catalog/aloeae - такие штуки ведут на специальную страницу, которая сообщает об ошибке
Проблема 1. При запросе вида mysite.com/catalog/aloe/test, т.е. когда через слеш появляется третий параметр, та же страница с уведомлением для пользователя отображается без стилей
Вот логика проверки, буквально, если в массиве получилось больше двух элементов, отобрази страницу ошибки
Скриншот фрагмента кода удалён модератором.
Скриншот фрагмента кода удалён модератором.
Страница отображается, но, как я сказал, без стилей. Консоль показывает, что все пути с директориями до соответствующих файлов (картинки и те же стили) съедаются, т.е. ../css/Exception.css превращается просто в название файла Exception.css, почему так происходит? С чем это может быть связано?
Скриншот фрагмента кода удалён модератором.
Проблема 2. Как корректно обработать запрос вида mysite.com/catalog/aloe/.test, хотелось бы тоже подставить собственную страницу с сообщением об ошибке, сейчас ответ выглядит так
Скриншот фрагмента кода удалён модератором.
Пока всё запуска только на локальном хосте. Автозагрузку организовал с композером по psr-4. Если проблемы можно решить конфигурированием .htaccess, вот мои настройки:
Скриншот фрагмента кода удалён модератором.
Дополнительно:
Пишите вьюху, шаблон шапки и подвала, они будут статичные и не будут ломаться стили
Это обязательно, см.п.3.8 Регламента.
Сюда же относится traceback, ввод и вывод в консоли и другая структурированная текстовая инфа.
"отображается без стилей" потому что надо всегда использовать абсолютные пути, а не относительные.
Хотя странно, в этом случае должно косячить либо с одним параметром в урл, либо с двумя.
Но абсолютные пути от корня сайта вместо всех этих точечек в HTML надо в любом случае прописать. Почитать что это такое можно здесь https://phpfaq.ru/newbie/paths
- спасибо, действительно, даже не задумался об этом; перешёл на абсолютные урлы, теперь все хорошо
Разбиваю строку на массив, из первого параметра получаю имя контроллера и создаю соответствующий экземпляр. Если нет второго параметра, вызываю действие по умолчанию: на сайте это отобразить каталог, или страницу со сатьями (uri соответственно mysite.com/catalog или mysite.com/articles). Если же есть второй параметр (это название конкретного растения или id статьи), вызываю другое действие и передаю параметр (получается mysite.com/catalog/aloe)
то что вы реализовали к роутингу имеет такое себе отношение. Роутинг обычно опирается на правила, а увас тупо захардкорен контроллер. Что будете делать если сложность будет чуть выше, и например, добавится язык перед контроллером?
При запросе вида mysite.com/catalog/aloe/test, т.е. когда через слеш появляется третий параметр, та же страница с уведомлением для пользователя отображается без стилей
Логично, стили у вас лежат всегда в одной папке, а вы их каждый раз подключаете из разных "путей" в урл, от которых зачем-то высчитываете сколько папок "выше отмотать". Путь должен быть абсолютным.
Вот логика проверки, буквально, если в массиве получилось больше двух элементов, отобрази страницу ошибки
Вообще логика должна быть такой, что если больше 2 параметров, то все что дальше помещается в какой-то массив, например $parameters, который можно получить из роутинга, и дальше в зависимости от значений что-то делать. Правильнее все же было бы сделать сопоставление пути с контроллером, экшеном и параметрами, как во взрослых роутерах, но для начала и так сойдет.
- угум, насчет роутинга вы правы. это мой первый сайт, поэтому делал без расчета на рост сложности и функционала в дальнейшем, вот и решил ограничиться двумя параметрами
спасибо большое
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для обработки строки запроса типа "catalog/aloe/aaaa", когда третий параметр в роутинге не предусмотрен, можно использовать следующий подход:
1. Разбить строку запроса по символу "/" с помощью функции explode.
2. Проверить количество элементов в полученном массиве.
3. Если количество элементов равно 3 или более, то обработать запрос как обычно.
4. Если количество элементов меньше 3, то считать третий параметр пустым или задать значение по умолчанию.
5. Пример реализации на языке PHP:
$route = $_SERVER['REQUEST_URI']; $parts = explode('/', $route); if(count($parts) >= 3) { $controller = $parts[1]; $action = $parts[2]; // Дополнительные параметры, если они есть $param1 = isset($parts[3]) ? $parts[3] : ''; $param2 = isset($parts[4]) ? $parts[4] : ''; // Далее обработка запроса } else { $controller = $parts[1]; $action = $parts[2]; $param1 = ''; // третий параметр пустой // Далее обработка запроса }
Таким образом, вы можете корректно обработать строку запроса типа "catalog/aloe/aaaa", даже если третий параметр в роутинге не предусмотрен.