我有以下路线定义
my_route:
path: /actual-path/
defaults:
_controller: MyBundle:MyController:detail
id: application_id
requirements:
methods: GET
id: \d+
控制器需要一个名为$id
的参数。
但我不想在网址中使用$id
,我想使用$request->attributes->get('application_id')
有一个监听器会将两个参数(application_id
和application
)作为路由过程之前的属性注入请求对象,因此该值就在那里。 (将它注入RequestContext
)也很容易。
有没有办法可以将路由中Request
或RequestContext
对象的属性值用作默认值?
现在我可以在我的控制器中执行$request->attributes->get('application_id')
。但是这种控制器将在几种情况下使用。在其他情况下,$id
将通过网址传递。我发现在路由中设置id比在某个地方在控制器中构建if-else子句更清晰。
答案 0 :(得分:0)
似乎无法在请求对象中的变量与路由/控制器操作中需要的参数之间进行“映射”。我认为这将是一件好事,因为它会变得相当复杂。
我选择了解决方案来扩展控制器并在那里构建一个小型交换机。
基本上,如果路由指定id === null
,它将回退到Request对象中的application_id
。否则它将使用提供的值。我只需要在必须不使用回退的路由上设置id的要求。
所有没有运行额外的侦听器,处理时间可能有点“昂贵”(对于每个请求)。
路线示例:
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和来自侦听器的后备之间进行切换。