2015-03-26 2 views
3

В настоящее время я пытаюсь реализовать несколько маршрутов для symfony 2.5, которые приводят меня к небольшой проблеме. Мне нужно иметь схему URL, которая имеет тот же маршрут в зависимости от пользовательской службы.Symfony 2 - Использование пользовательского сервиса в выражении маршрутизации

route_category: 
    pattern: /{location}/{category} 
    defaults: { _controller: LocationBundle:Category:index } 
    condition: "service('location_category_service').isCategory(request.get('category')) == true" 

route_merchant: 
    pattern: /{location}/{merchant} 
    defaults: { _controller: LocationBundle:Merchant:index } 
    condition: "service('location_merchant_service').isMerchant(request.get('merchant')) == true" 

То, что я хочу Symfony, чтобы сделать это:

Учитывая URL путь: /Германия/рестораны

  • соответствия попробовать маршрут 1
  • "isCategory" возвращает истину, так что Маршрутные совпадения

Путь к URL: /Германия/Aldi

  • соответствия попробовать маршрут 1
  • "isCategory" возвращает ложь, поэтому мы пропускаем этот маршрут
  • соответствия попробовать маршрут 2
  • "isMerchant" возвращает истину, так что этот маршрут соответствует и мы выполняем MerchantController

Учитывая URL путь: /Германия/это-делает-не-матч-нибудь

  • соответствия попробовать маршрут 1
  • "isCategory" возвращает ложь, поэтому мы пропускаем этот маршрут
  • соответствия попробовать маршрут 2
  • "isMerchant" возвращает ложь, поэтому мы пропускаем этот маршрут
  • .. теперь мы можем выполнить поведение по умолчанию, когда маршрут не соответствует

Я думал, что условие будет точно делать то, что я хочу, но у меня есть запросКонтекст и запрос в язык выражения, а не контейнер обслуживания.

Кто-нибудь знает, как я могу ввести контейнер службы в язык выражений для целей маршрутизации или, возможно, что-то еще, что поможет решить эту проблему?

Заранее спасибо :-)

+1

извините за OT, но как вы получили 'service (...)', чтобы работать? Я пытаюсь использовать сервис в состоянии, но все, что я получаю, это 'Функция« сервис »не существует в позиции 1'. – ex3v

ответ

1

Имея две переменные, как это хлопотно. Из опыта лучшей практики, чтобы отделить эти два со статическим значением следующим образом:

route_category: 
    pattern: /{location}/category/{category} 

route_merchant: 
    pattern: /{location}/merchant/{merchant} 

В противном случае, как Дэвид Kmenta сказал, что вы будете писать дополнительный код, пытаясь понять, что есть что.

Задайте себе вопрос, стоит ли использовать этот тип кодирования в словах?

Чтобы добавить к этому, подумайте о своих пользователях: если у вас есть купец, который звучит как категория, они узнают разницу или схема, которую вы только что сбиваете с толку.

+0

Да, вы абсолютно правы. Это приведет только к коду, который определяет, какой маршрут должен соответствовать. Теперь я решил эту проблему, указав требование для {category} быть одним из трех значений, поэтому теперь для сопоставления url не требуется динамическое соединение с базой данных. Благодарим за помощь :-) – kr1x

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