Задать вопрос

Как корректно обработать строку запроса типа 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, вот мои настройки:
Скриншот фрагмента кода удалён модератором.
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
"отображается без стилей" потому что надо всегда использовать абсолютные пути, а не относительные.
Хотя странно, в этом случае должно косячить либо с одним параметром в урл, либо с двумя.
Но абсолютные пути от корня сайта вместо всех этих точечек в HTML надо в любом случае прописать. Почитать что это такое можно здесь https://phpfaq.ru/newbie/paths
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Разбиваю строку на массив, из первого параметра получаю имя контроллера и создаю соответствующий экземпляр. Если нет второго параметра, вызываю действие по умолчанию: на сайте это отобразить каталог, или страницу со сатьями (uri соответственно mysite.com/catalog или mysite.com/articles). Если же есть второй параметр (это название конкретного растения или id статьи), вызываю другое действие и передаю параметр (получается mysite.com/catalog/aloe)
то что вы реализовали к роутингу имеет такое себе отношение. Роутинг обычно опирается на правила, а увас тупо захардкорен контроллер. Что будете делать если сложность будет чуть выше, и например, добавится язык перед контроллером?

При запросе вида mysite.com/catalog/aloe/test, т.е. когда через слеш появляется третий параметр, та же страница с уведомлением для пользователя отображается без стилей
Логично, стили у вас лежат всегда в одной папке, а вы их каждый раз подключаете из разных "путей" в урл, от которых зачем-то высчитываете сколько папок "выше отмотать". Путь должен быть абсолютным.

Вот логика проверки, буквально, если в массиве получилось больше двух элементов, отобрази страницу ошибки
Вообще логика должна быть такой, что если больше 2 параметров, то все что дальше помещается в какой-то массив, например $parameters, который можно получить из роутинга, и дальше в зависимости от значений что-то делать. Правильнее все же было бы сделать сопоставление пути с контроллером, экшеном и параметрами, как во взрослых роутерах, но для начала и так сойдет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы