Symfony перенаправляет на имя динамического маршрута

Я использую пакет маршрутизации Symfony CMF для создания динамических маршрутов (здесь я использую один пример):

$route = new Route('/dynamic-url');
$route->setMethods("GET");
$route->setDefault('_controller', 'AppBundle:MyRoute:getResponse');

$routeCollection->add('my-dynamic-route', $route);

Ответ загружается из функции getResponseAction () внутри MyRouteController:

/**
 * No annotations here, because I want the url to be dynamic from the database
 */
public function getResponseAction(Request $request) {

    return $this->render('dynamic-page-template.html.twig');

}

Когда я перехожу к '/ dynamic-url', он работает.

Находясь в другом контроллере, я хочу перенаправить на этот динамический маршрут, например:

return $this->redirectToRoute('my-dynamic-route');

Но я получаю эту ошибку: «Ни один из связанных маршрутизаторов не смог сгенерировать маршрут: маршрут 'my-dynamic-route' не найден»

Также интересно: когда я перехожу к '/ dynamic-url', панель разработки фактически говорит, что имя маршрута - «my-dynamic-route».

Изменить

Когда я загружаю все маршруты, я не вижу своих динамических имен маршрутов:

$this->get('router')->getRouteCollection();

Думаю, они должны быть в этом списке.


person BigJ    schedule 01.06.2017    source источник


Ответы (3)


Поскольку это динамический маршрут, который нигде не сохранялся (например, routing.yml), он будет доступен только для запроса, в котором он был определен. Таким образом, в конце запроса ваше приложение немедленно «забудет» о новом маршруте, созданном во время выполнения.

Когда я загружаю все маршруты, я не вижу своих динамических имен маршрутов: $this->get('router')->getRouteCollection(); Я думаю, что они должны быть в этом списке.

На самом деле Нет. Это зависит от того, куда вы звоните $this->get('router')->getRouteCollection(); Просто попробуйте позвонить

dump($this->get('router')->getRouteCollection();)

прямо перед оператором return в вашем действии, где вы добавляете маршрут my-dynamic-route. Я уверен, что вы увидите свой my-dynamic-route в списке маршрутов, но если назовете его куда-нибудь еще - вы его не увидите.

Это не столько о Symfony, сколько о природе Интернета без сохранения состояния (см. Почему говорят, что HTTP такое протокол без сохранения состояния?)

person V-Light    schedule 01.06.2017
comment
Спасибо! Динамические маршруты действительно «забываются», а статическая маршрутизация сохраняется. Я перешел на использование «LoaderInterface», поэтому маршруты сохраняются. Я использовал это руководство mmoreram.com/blog/2013/10 / 01 / динамические маршруты-в-symfony2 - person BigJ; 01.06.2017

Я начал думать об этом и указал на ваш вопрос проблему маршрутизации на symfony -cmf. Вы отметили # symfony-cmf, и я думаю, что это будет важная функция для нас.

Я также думаю, что когда вы сохраняете свой маршрут с помощью /my-route, вы также должны запрашивать у маршрутизатора это имя (или в случае CMF с объектом содержимого с этим маршрутом).

person Maximilian Berghoff    schedule 20.07.2017

Если вы используете динамический маршрутизатор CmfRoutingBundle, вам следует сохранить свои маршруты к доктрине. Идея динамического здесь заключается в том, что они могут быть созданы во время выполнения, например. в интерфейсе администратора или где-либо еще с помощью кода. DynamicRouter загружает маршруты из базы данных.

Если вы используете PHPCR-ODM, имя маршрута - это идентификатор репозитория, обычно что-то вроде /cms/routes/my-route и вы можете создать его с этим именем. Если у вас есть доступ к объекту маршрута, загруженному из базы данных, вы также можете сгенерировать его из него, а не из пути. Если вам нужно жестко запрограммировать путь в вашем приложении, это означает, что, вероятно, лучше использовать нормально настроенный маршрут.

Если вы просто добавляете маршрут в коллекцию маршрутов на лету, вам нужно будет убедиться, что это происходит в каждом запросе, он доступен только тогда, когда вы его добавляете. С помощью CMF ChainRouter вы можете зарегистрировать свой собственный маршрутизатор, который делает это, но я не знал бы о хорошем варианте использования для этого. Если вы знаете маршрут, вы можете настроить его в файле конфигурации routing.xml | yml | php. Или маршруты загружаются динамически, и в этом случае вы должны использовать DynamicRouter, возможно, с пользовательский загрузчик маршрута.

person dbu    schedule 21.07.2017