2015-07-22 11 views
3

В моем проекте Symfony2 у меня есть новостной сайт с сообщениями. Эти должности могут быть опубликованы в разных регионах. Текущая область (выбор пользователя) должна быть частью URL-адреса. Таким образом, URL-адрес должен выглядеть следующим образом:Можно ли добавить пользовательские глобальные переменные маршрута Symfony2, такие как _format и _locale?

/mag => main news site, no region selection 
/mag/region1/ => posts for region 1 
/mag/region2/ => ... 
/mag/region1/my-news-post-slug => detail view of one post 

Для новостных сообщений, я использовал Sonata News Bundle.

Теперь, мой вопрос: Как мне добавить регион в систему маршрутов без изменения каждого контроллера и шаблона пакетов, которые я использую? Когда я просто добавить его в маршрутизации конфигурации как

magazin: 
    resource: '@SonataNewsBundle/Resources/config/routing/news.xml' 
    prefix:  /mag/{region} 

я получаю ошибки, так как этот параметр не задан при создании маршрута в контроллерах и шаблоны новостей пачке (и другие). Мне нужно что-то вроде переменных маршрута {_format} или {_locale}, которые, очевидно, уже добавлены компонентом маршрутизации. Можно ли добавить такие глобальные значения?

+0

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

+0

Я продлил комплект новостей с помощью простого расширения пакета и скорректировал 2 метода в контроллере. Я не хочу копировать и редактировать весь код исходных пакетов, но только некоторые вещи, которые мне действительно нужно изменить/расширить. – Michael

+0

Да. Это всегда одна из опасностей использования сторонних пакетов. Может быть, черта может помочь. – Cerad

ответ

1

Посмотрите, как Symfony делает это с помощью локали.

https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php

Они используют слушатель событий, чтобы захватить локали из параметров запроса и добавить его в контекстных параметры маршрутизатора.

+0

Это работает как шарм. Хотя объект 'Request' не имеет выделенного свойства, но наличие его внутри пакета параметров подходит для меня. Сначала это не сработало, но я просто забыл зарегистрировать слушателя как услугу. Это делается в https://github.com/symfony/symfony/blob/2aeaa22e3171b5e1f10f2cc2a7ff7f6608b65f9d/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml для примера локали. – Michael

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

  • Нет связанных вопросов^_^