Пользовательская маршрутизация с помощью Symfony 2

У меня есть довольно сложные правила маршрутизации, которые достижимы только с помощью специального кода, а не с маршрутизатором по умолчанию.

Маршрутизатор также должен учитывать доменное имя.

Возможно ли (и как) определить мой собственный класс Router, который будет иметь метод, принимающий Request и возвращающий имя пула / контроллера?

Related of "Пользовательская маршрутизация с помощью Symfony 2"

Чтобы добиться того, что вы просите, вам не нужно полностью переопределять маршрутизатор

Вы можете просто написать свой собственный класс, который реализует UrlMatcherInterface . Если вы хотите иметь возможность создавать URL-адреса, соответствующие вашей схеме, вам придется создать еще один класс, который также переопределяет UrlGeneratorInterface .

Чтобы принять во внимание доменное имя, вам необходимо использовать RequestContext, который передается их конструкторам (он плохо документирован, но для получения подробной информации проверьте Router :: get {Matcher, Generator}).

Как только ваши классы подготовлены, вы можете ввести их в маршрутизатор, просто переопределив параметры «router.options.generator_class» и «router.options.matcher_class» в вашем комплекте.


Тем не менее , это может быть не лучший подход к тому, что вы хотите – переопределение частей маршрутизатора, как это требует большой осторожности, чтобы сохранить все кэширование.

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

Используя эту информацию, вы можете загрузить другую «среду» для каждого запроса, с той только разницей между различными средами, что они используют разные файлы маршрутизации.

Изучив учебник Маттиаса Новака, я сделал небольшую модификацию для моего CRUD-маршрутизатора.

До и после использования CrudLoader можно увидеть здесь в маршрутизации / crud / acompetencies.yml

Это просто обходной путь или неправильное использование ресурса, как вы можете видеть в этом классе CrudLoader .

Я не знаю, правильная или плохая практика. Кажется, это хорошо работает.

связать сонату adminata, которая имеет собственные классы классов маршрутизации

Для symfony 2.5 требуется параметр для пользовательского совпадения: router.options.matcher_base_class и класс, который реализует Symfony \ Component \ Routing \ Matcher \ RequestMatcherInterface