【问题标题】:Symfony: Resolve service in routeSymfony:解决路由中的服务
【发布时间】:2016-10-24 13:36:03
【问题描述】:

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

例如,侦听器将使用以下路由中定义的服务 (@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%'

不幸的是,虽然参数得到了解决,但我发现服务没有。目前绕过这种方法的唯一方法是将服务容器直接注入到侦听器中,并查询服务,这是不受欢迎的。

还有更好的选择吗?鉴于我真的很难找到解决路线内服务的问题,整个方法是否应该避免?

【问题讨论】:

  • 我从未见过以这种方式使用defaults。它是否记录在任何地方?
  • 在内核监听器的情况下,注入容器被认为是可以接受的。至少我自己。
  • @Martin 没有在任何地方记录,只是我天真地期望它能够工作,给定参数已解决(@see github.com/symfony/symfony/blob/master/src/Symfony/Bundle/…)。我也可以为此使用options,但同样的问题也适用。

标签: php symfony


【解决方案1】:

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

路线

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 https://github.com/symfony/http-kernel/blob/master/EventListener/RouterListener.php#L97)。

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

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

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

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

优势

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

缺点

  • 对不熟悉的眼睛有意想不到的魔力。
  • 如果处理不当,服务从请求中解析值可能是一个安全问题。

我现在将继续使用它,因为它的优势很吸引人。当解决方案不再适用时,我会检查。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2019-06-13
    • 2021-06-26
    • 1970-01-01
    • 2019-02-12
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多