Мне нужно иметь динамические маршруты с symfony 2, где в URL-адрес добавлен параметр slug и связан со страницей в базе данных. Каждая страница имеет собственный пул и его содержимое, хранящиеся в базе данных. Я прочитал статью « Расширенная маршрутизация», но для старой версии Symfony. Для новой версии кажется, что ParamConverter выполняет аналогичную работу. Является ли это правильным способом реализации маршрутизации, основанной на доктринах, или я должен написать настоящий пользовательский класс маршрутизатора?
Да, я бы использовал ParamConverter. По умолчанию DoctrineParamConverter, который поставляется с FrameworkExtraBundle, может обрабатывать самые простые случаи – то есть он знает, как искать объект, связанный с типом, полем с тем же именем, что и заполнитель маршрута:
// routing.yml foo_route: pattern: /{slug}/ defaults: { _controller: FooVendorBundle:Foo:view } // FooVendorBundle/Controller/FooController.php public function view(FooEntity $foo) { // $foo will be an instance of FooEntity }
Обычно в списке аргументов контроллера вы должны иметь переменную $slug
, которая будет заполнена из содержимого {slug}
захваченного маршрутом. Однако с помощью ParamConverter он распознает, что вы запрашиваете класс FooEntity
, и попытаетесь найти этот объект по захваченному значению slug
и заполнить переменную $foo
этим объектом.
По умолчанию ParamConverter, конечно, ограничен только возможностью поиска свойств, которые на самом деле существуют в сущности: если FooEntity не имеет поля с именем slug
, поиск не будет выполнен, и будет выведено исключение. Как я уже сказал, это будет обрабатывать большинство базовых вариантов использования. Если вам нужно больше углубленного преобразования параметров запроса, вы всегда можете написать свой собственный.