symfony routing,使用Request中的值作为默认值

时间:2016-06-14 10:14:16

标签: symfony symfony-routing

我有以下路线定义

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_idapplication)作为路由过程之前的属性注入请求对象,因此该值就在那里。 (将它注入RequestContext)也很容易。

有没有办法可以将路由中RequestRequestContext对象的属性值用作默认值?

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

1 个答案:

答案 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和来自侦听器的后备之间进行切换。