2013-06-24 6 views
0

Я пытаюсь создать URL-адрес с аннотациями маршрута.Symfony 2 @Route аннотация, чувствительная к регистру

Проблема в том, что я могу написать любой URL большой, небольшой или другой.

@Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"}) 

Этот URL можно получить как из www.example.com/berlin и под www.example.com/Berlin.

Я был бы, однако, достижим только под www.example.com/berlin.

ответ

1

У вас есть "/{staat}/", но ваши требования установлены "location" = ..., они должны совпадать, так что, возможно, это причина вашей проблемы.

Если вы не хотите жестко кодировать список состояний вашего маршрута, вы можете ввести параметр сдерживания службы в список состояний. Просто посмотрите How to use Service Container Parameters in your Routes в документации, как это сделать.

Если вы просто хотите проверить, является ли это состояние все в нижнем регистре, вы можете попробовать следующее требование:

staat: "[a-z-]+" 

Это должно соответствовать только символы нижнего регистра и тире (например, для «Саксония-Анхальт») , Но я не совсем уверен, что это будет работать, поскольку регулярное обнаружение маршрутизатора немного изворотливое.

Вы также можете создать custom Router Loader, который будет создавать маршруты программно, например. путем выбора списка состояний из базы данных или файла.

редактировать:

Как я уже писал в своем комментарии я хотел бы добавить в список Params в качестве параметра Service Container, например, %my_demo.states%, содержащий список состояний. Однако я не уверен, что это будет работать с аннотациями. Итак, вот краткое обходное решение, как заставить его работать.

В вашей app/config/config.yml вы добавите %my_demo.states% параметр:

my_demo: 
    states: ["berlin", "brandenburg", "sachsen-anhalt", ... ] 

В вашем app/config/routing.yml должно быть что-то вроде этого:

my_demobundle: 
    resource: "@MyDemoBundle/Controller/" 
    prefix: /
    type:  annotation 

type: annotation и @MyDemoBundle является соответствующая часть. Добавьте следующий маршрут перед тем этот, чтобы убедиться, что он имеет преимущество:

showStaats: 
    path:  /{state} 
    defaults: { _controller: MyDemoBundle:State:index } 
    requirements: 
     state: %my_demo.states% 

Это добавит маршрут, который будет применяться до аннотации, используя список государств, в качестве параметров. Это немного грубо, поскольку вы смешиваете маршрутизацию на основе yml/annotation, но это все же лучше, чем переписывать список из 16 состояний в аннотации, не говоря уже о том, что его проще поддерживать.

+0

у меня есть шанс, что в @ Маршрут ("/ {location} /", name = "showStaats", requirements = {location: "[az -] +" location "=" berlin | bayern | brandenburg}}. Так что это не сработает. – Vico

+0

снова небольшая ошибка в вашей аннотации (отсутствующая запятая между вашими требованиями 2). Я не думаю, что вы можете одновременно применять оба требования, переписываем другую. Вы должны использовать связанный с параметром-параметром параметр Service Container, поскольку у вас есть фиксированный список состояний. Я добавлю пример моего ответа ... – dbrumann

1

Отвечая на вопрос «Как сделать регистронезависимое требование маршрутизации»:

Вы можете добавить модификатор регистронезависимое требованию регулярное выражение так:

(?i:berlin|bayern|brandenburg)

Смежные вопросы