【发布时间】:2016-06-14 10:14:15
【问题描述】:
我有以下路线定义
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_id 和application)作为属性注入到请求对象中,所以这个值就在那里。 (也很容易将其注入RequestContext)。
有没有一种方法可以在我的路由中使用来自Request 或RequestContext 对象的属性值作为默认值?
现在我可以在我的控制器中简单地执行$request->attributes->get('application_id')。但是这个控制器会在几种情况下使用。在其他情况下,$id 将通过 url 传递。我发现在路由中设置 id 比在控制器中的某处构建 if-else 子句更干净。
【问题讨论】:
-
Controller::myAction(Request $request, $application_id) 会做你想做的事。控制器解析器将使用参数名称自动从请求对象中提取数据。你的问题有点混乱。如果 url 中不存在 id,则只需在 application_id 中添加您的侦听器。无论如何,我怀疑你的路线定义需要更多的工作。
-
问题是,我无法更改控制器:操作,因为这是一个通用操作(位于供应商目录中)。所以控制器期待
id,但Request中的值是application_id。所以基本上,我需要在路由配置中进行某种映射。 -
我想你可以用表达式来做到这一点:symfony.com/doc/current/book/…。否则,请添加另一个内核侦听器来执行此操作。
-
我已经在研究了,但我担心这也会变得有点混乱。我想我最好的机会是处理它是扩展控制器并在那里处理它。例如,如果 id === null,则使用 application_id。
-
监听器很容易,特别是如果你有不止一条路线来处理这种事情。