Я хочу создать 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, и это не нормально, потому что не соответствует первому маршруту.
Как мне это сделать?




Все, что вам нужно сделать, это добавить требование при настройке маршрутов в вашем контроллере. Вот так :
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}