Php Symfony:解决路由中的服务

Php Symfony:解决路由中的服务,php,symfony,Php,Symfony,我需要为每个路由实现各种元数据属性,我的一个想法是将这些属性直接应用到每个路由上,供外部元数据侦听器使用 例如,侦听器将使用下面路由上定义的服务(@example\u title\u resolver)解析为某种形式的页面标题 example_route: path: /blah/blah defaults: _controller: MyBundle:MyController:index meta: title:

我需要为每个路由实现各种元数据属性,我的一个想法是将这些属性直接应用到每个路由上,供外部元数据侦听器使用

例如,侦听器将使用下面路由上定义的服务(
@example\u title\u 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得到了解决,但我发现服务没有得到解决。目前解决此方法的唯一方法是将服务容器直接注入侦听器,并查询服务,这是不受欢迎的


还有更好的选择吗?考虑到我一直在努力寻找解决路线内服务的方法,这种方法是否应该避免?

以下是我最终得到的解决方案:

路线

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-服务解析程序。 在优先级为33或更高的RouterListener之后立即调用,此时路由参数已应用于请求(@see)

附加到
kernel.request
事件的侦听器检查了请求参数,并针对注入侦听器的服务容器解析了所有服务(以@为前缀的字符串值)

侦听器2-元数据侦听器。 此时,路由/请求上的所有内容都已解析为服务。这将使关注点解耦,并允许更多不相关的侦听器从与请求中直接可用的服务对话的能力中获益

在本例中,元数据侦听器将在请求上查找特定的参数(已解析的服务)。例如,这些对象将用于解析元数据值。然后,需要一个通用的机制使该数据可供视图使用

解析器类 负责将给定的模板字符串转换为最终值。由上面的元数据侦听器调用

优势

  • 分离关注点,使控制器更加可重用
  • 灵活,允许开发/放弃轻量级解析器类
  • 在元数据的特定情况下,当不可避免地需要添加新类型的元数据时,提供了一种很好的未来验证方法。这将只是一个新的解析器,是对路由的一个小的添加
缺点

  • 对一只陌生的眼睛来说是意想不到的魔法
  • 如果处理不当,来自请求的服务解析值可能是一个安全问题

我现在就开始考虑这个问题,因为它的优点很吸引人。当解决方案不再适用时,我将签入。

我从未见过以这种方式使用
默认值。它在任何地方都有文档记录吗?对于内核侦听器,注入容器被认为是可以接受的。至少是我的我。@Martin没有任何文档记录,只是我天真地希望它能工作,给定的参数已经解决(@see)。我也可以使用
选项
,但同样的问题也适用。