0

我有以下路线定义

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

控制器需要一个名为 的参数$id

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

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

有没有办法可以在路由中使用Requestor对象的属性值作为默认值?RequestContext


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

4

1 回答 1

0

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

我采用了扩展控制器并在那里构建一个小开关的解决方案。

基本上,如果路由指定id === null,它将回退到application_idRequest 对象中。否则它将使用提供的值。我只需要在不能使用回退的路由上设置对 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 和来自侦听器的后备之间的切换放在另一种方法中。

于 2016-06-15T10:32:37.750 回答