Symfony: Как кодировать / в параметре URL?

Я хочу создать RESTful API с URL-адресами, например:

Первый маршрут: http://example.com/api/ {element_name} / aaa / {related_name} и Второй маршрут: http://example.com/api/ {element_name} / bbb / {related_name}.

Ewerything - это просто и легко, когда element_name является целым числом или простым текстом. Все усложняется, когда параметр {element_name} имеет символ "/" в имени, потому что даже если я закодирую / с помощью% 2f (url encode), маршрутизация будет декодировать% 2f до маршрутов процессов.

Например, когда я хочу сгенерировать URL-адрес для первой четверти и у меня есть {element_name} = xyz и {related_name} = ooo, тогда URL-адрес будет http://example.com/api/xyz/aaa/ooo, и все в порядке.

Но когда у меня есть {element_name} = xyz / bbb и {related_name} = ooo, тогда URL-адрес должен быть: http://example.com/api/xyz%2fbbb/aaa/ooo, но маршрутизация сначала декодирует URL-адрес и делает: http://example.com/api/xyz/bbb/aaa/ooo, и это не нормально, потому что не соответствует первому маршруту.

Как мне это сделать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
1 269
1

Ответы 1

Все, что вам нужно сделать, это добавить требование при настройке маршрутов в вашем контроллере. Вот так :

class DefaultController
{
  /**
  * @Route("/share/{token}", name = "share", requirements = {"token" = ".+"})
  */
  public function share($token)
  {
    // ...
  }
}

это объясняется в документе SF: http://symfony.com/doc/current/routing/slash_in_parameter.html

Это недопустимое решение, потому что URL-адрес типа: example.com/api/xyz%2fbbb/aaa/ooo должен вести к первый маршрут с параметрами {element_name} = xyz / bbb и {related_name} = ооо, но маршрутизация разрешит его как example.com/api/xyz/bbb/aaa/ooo, и он будет сопоставлен с первым маршрутом с параметрами {element_name} = xyz и {related_name} = aaa / ooo когда вы используете требование. + для {element_name}, или он будет сопоставлен со вторым маршрутом с параметрами {element_name} = xyz / bbb и {related_name} = ooo, когда вы используете. + требование для {related_name}

Dawid Szałęga 27.07.2018 12:54

Другие вопросы по теме