Как правильно обрабатывать строку запроса "catalog/aloe/aaaa", если в роутинге отсутствует третий параметр (только "/")?

Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
  • 14 августа 2023 г. 14:56
Ответы на вопрос 4
Доброго времени суток! Если в роутинге отсутствует третий параметр и строка запроса состоит только из "/catalog/aloe/aaaa", то можно считать, что третий параметр отсутствует или имеет пустое значение.

В зависимости от языка программирования, который Вы используете, обработка такой строки может быть разной. Но в общем случае вы можете проверить наличие третьего параметра в строке и, если его нет или он пустой, присвоить нужное Вам значение.

Например, на языке Python можно использовать метод `split()`, чтобы разделить строку по символу "/":

```python
url = "/catalog/aloe/aaaa"
params = url.split("/")
param1 = params[1]  # "catalog"
param2 = params[2]  # "aloe"

if len(params) > 3:
    param3 = params[3]
else:
    param3 = ""  # пустое значение, если третий параметр отсутствует

print(param1, param2, param3)  # выводит: catalog aloe ""

```

Подход может отличаться в зависимости от конкретных требований вашего проекта или используемого фреймворка. Поэтому рекомендуется проверить документацию или примеры кода для вашего языка программирования или фреймворка.
 Разделите строку на массив и используйте первый элемент, чтобы получить имя контроллера и создать его экземпляр. Если второго элемента нет, вызовите действие по умолчанию, например, отобразите каталог или страницу со статьями (например, mysite.com/catalog или mysite.com/articles). Если второй элемент есть (например, это название конкретного растения или id статьи), вызовите другое действие и передайте этот параметр (например, mysite.com/catalog/aloe). То, что вы реализовали для роутинга, имеет некоторые ограничения. Обычно роутинг основывается на правилах, а ваш подход фиксирует конкретный контроллер. Как будете обрабатывать более сложные ситуации, например, добавление языка перед контроллером? В случае запроса вида mysite.com/catalog/aloe/test, когда появляется третий параметр через слеш, страница с уведомлением для пользователя отображается без стилей. Это происходит потому, что вы каждый раз подключаете стили из разных "путей" в URL и пытаетесь вычислить, насколько "выше" должно быть перемотано. Чтобы избежать этой проблемы, используйте абсолютные пути. Например, если стили всегда находятся в одной папке, используйте абсолютный путь к этой папке. Если в массиве больше двух элементов, отобразите страницу ошибки. Хорошей практикой является проверка наличия параметров и обработка их в соответствии с логикой вашего приложения.
"Отображается без стилей" возможно из-за использования относительных путей в URL. Чтобы избежать этой проблемы, рекомендуется всегда использовать абсолютные пути от корня сайта. Более подробную информацию можно найти здесь: https://phpfaq.ru/newbie/paths.

Переписываю строку на массив, в первом параметре получаю имя контроллера и создаю соответствующий экземпляр. Если второго параметра нет, то вызывается действие по умолчанию, которое отображает каталог или страницу со статьями (соответственно, URL будет выглядеть как mysite.com/catalog или mysite.com/articles). Если второй параметр присутствует (название конкретного растения или ID статьи), то вызывается другое действие и передается этот параметр (таким образом, URL будет иметь вид mysite.com/catalog/aloe).

Мне кажется, то что вы реализовали в роутинге имеет некоторые недостатки. Обычно роутинг опирается на правила, а в вашем случае контроллер жестко задан. Что будет, если потребуется добавить язык перед названием контроллера? Мне кажется, более правильным подходом было бы использование правил роутинга, чтобы откликаться на разные URL-адреса.

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

Логика проверки должна быть такой, что если в массиве больше двух элементов, то отображается страница ошибки. Однако было бы логичнее обработать все параметры после второго элемента в отдельном массиве, например $parameters, который можно получить из роутинга, и затем выполнять необходимые действия в зависимости от значений. Хотя правильнее всего было бы использовать более сложную логику роутинга для сопоставления пути с контроллером, экшеном и параметрами.
"отображается без стилей" - чтобы избежать этой проблемы, всегда используйте абсолютные пути вместо относительных. В HTML нужно указывать путь от корня сайта. Подробнее о том, что такое абсолютные пути, можно прочитать здесь: https://phpfaq.ru/newbie/paths 
Похожие вопросы