2016-06-14 37 views
0

我有以下路由定义symfony的路由,使用值从请求的默认

my_route: 
    path:    /actual-path/ 
    defaults: 
     _controller: MyBundle:MyController:detail 
     id:    application_id 
    requirements: 
     methods:  GET 
     id:    \d+ 

控制器需要一个叫做$id参数。

但我不希望在URL中使用的$id,我想用一个值是在$request->attributes->get('application_id')

可有将注入两个参数(application_idapplication)到请求的监听器对象作为路由过程之前的属性,所以这个值就在那里。 (它也很容易注入到RequestContext)。

有没有一种方法可以使用我的路由中的RequestRequestContext对象的属性值作为默认值?


现在我可以简单地在我的控制器中执行$request->attributes->get('application_id')。但是这种控制器将在几种情况下使用。在其他情况下,$id将通过url传递。我发现在路由器中设置id比在控制器中建立if-else子句更清洁。

+0

Controller :: myAction(Request $ request,$ application_id)会做你想做的。控制器解析器将使用参数名称自动将数据从请求对象中拉出。你的问题有点混乱。如果这个id不存在于url中,那么只需让你的监听器添加到application_id中。无论如何,我怀疑你的路线定义需要更多的工作。 – Cerad

+0

事情是,我无法更改控制器:action,因为这是一个通用操作(位于供应商目录中)。所以控制器期待'id',但Request中的值是'application_id'。所以基本上,我需要在路由配置中进行某种映射。 – DoppyNL

+0

我想你可以用表达式来完成它:http://symfony.com/doc/current/book/routing.html#completely-customized-route-matching-with-conditions。否则,添加另一个内核监听器来执行此操作。 – Cerad

回答

0

似乎不可能在请求对象中的变量之间进行“映射”,并且您的路由/控制器操作需要您需要的参数。我认为这会是一件好事,否则它会变得非常复杂。

我用解决方案来扩展控制器,并在那里建立一个小型开关。

基本上,如果路由指定了id === null,它将执行回退到请求对象中的application_id。否则它将使用提供的值。我只需要在不能使用回退的路由上设置id的要求。

所有这些都没有运行额外的Listener,这可能在处理时间(对于每个请求)中有点“昂贵”。路线

例子:

my_route: 
    path:    /actual-path/ 
    defaults: 
     _controller: MyBundle:MyController:detail 
     id:    null 
    requirements: 
     methods:  GET 

my_other_route: 
    path:    /other-path/{id} 
    defaults: 
     _controller: MyBundle:MyController:detail 
    requirements: 
     methods:  GET 
     id:    \d+ 

以及如何在控制器来处理这个问题:

// fallback to system id 
    if ($id === null) { 
     $id = $request->attributes->get('administration_id', null); 
    } 

因为您扩展控制器/动作,你也可以在更改参数的名称行动(只要类型不变)。

我没有这样做,因为我可以很容易地在提供的ID和从另一个方法中的侦听器回退之间进行切换。

+0

请注意,您可以使用您的现有侦听器。用户可以在不同的时间收听不同的事件。但是,无论对你而言,都是好的。 – Cerad