我需要为每条路线实现各种元数据属性,我的一个想法是将属性直接应用到每条路线上,以供外部元数据监听器使用。
例如,侦听器将使用在以下路由中定义的服务(@example_title_resolver
)来解析某种形式的页面标题。
example_route:
path: /blah/blah
defaults:
_controller: MyBundle:MyController:index
meta:
title:
resolver: '@example_title_resolver'
value: 'Example | %%value_to_be_resolved%% | %default_title_suffix%'
不幸的是,虽然params得到了解决,但我发现服务却没有。现在解决这种方法的唯一方法是将服务容器直接注入监听器,并查询服务,这是不受欢迎的。
还有更好的选择吗?鉴于我真的很难找到解决路线内的服务问题,这整个方法是否应该避免?
答案 0 :(得分:0)
以下是我最终解决的问题:
<强>路线强>
example_route:
path: /blah/blah
defaults:
_controller: MyBundle:MyController:index
meta:
title:
resolver: '@example_title_resolver'
value: 'Example | %%value_to_be_resolved%% | %default_title_suffix%'
听众1 - 服务解析器。 在RouterListener之后立即调用,优先级为33或更高,此时路由参数已应用于请求(@see https://github.com/symfony/http-kernel/blob/master/EventListener/RouterListener.php#L97)。
附加到kernel.request
事件的侦听器检查了请求参数,并解决了注入侦听器的服务容器的所有服务(前缀为@的字符串值)。
监听器2 - 元数据监听器。 此时,路由/请求上的所有内容都已解析为服务。这解决了问题,并允许更多不相关的听众从与请求中直接可用服务交谈的能力中受益。
在此示例中,元数据侦听器将在请求中查找特定的params(已解析的服务)。例如,这些对象将用于解析元数据值。然后需要一种通用机制来使该数据可供视图使用。
解析程序类 负责将给定的模板字符串转换为最终值。由上面的元数据监听器调用。
<强>优点强>
<强>缺点强>
我现在要开始这样做,因为优势很吸引人。我会在解决方案不再适合时办理登机手续。