2

我在我的代码中使用了 Twig 和 Symfony 路由,我想使用 Symfony Twig Bridge 与 Twig 集成。

我已经安装了它们,我需要做的是添加到需要 Symfony\Component\Routing\Generator\UrlGenerator 的 Twig 扩展 Symfony\Bridge\Twig\Extension\RoutingExtension。

UrlGenerator 需要 2 个参数:

  • 路线集合
  • 请求上下文

所以在我的 yaml 服务文件中,我有:

    router:
    class: Symfony\Component\Routing\Router
    arguments:
        - '@yaml.file.loader'
        - '%routing.file%'
        - { 'cache_dir' : '%cache.dir%' }
        - '@request.context'

    twig:
    class: Twig_Environment
    calls:
        - ['addExtension', ['@twig.extensions.debug']]
        - ['addExtension', ['@twig.extensions.translate']]
        - ['addExtension', ['@twig.extensions.routing']]
    arguments:
        - '@twig.loader'
        - '%twig.options%'

    twig.extensions.routing:
    class: Symfony\Bridge\Twig\Extension\RoutingExtension
    public: false
    arguments:
        - '@twig.url.generator'

最后是 UrlGenerator:

    twig.url.generator:
    class: Symfony\Component\Routing\Generator\UrlGenerator
    public: false
    arguments:
        - '@router'
        - '@request.context'

不幸的是@router 不是路由集合类型。它有方法 getRouteCollection 允许获取 UrlGenerator 所需的数据,如果我手动添加扩展名,它就可以工作。从控制器。但我不想在不同文件之间拆分服务定义,而是希望将它们保留在 yaml 服务定义中。

所以问题是:如何将参数作为参数传递给 UrlGenerator,而不是原始对象 Router,而是 getRouteCollection 的结果?

4

1 回答 1

1

有多种方法可以做到这一点:

使用 Symfony 表达式语言

如果你安装了 Symfony 表达式语言组件,你可以在你的服务定义中这样做:

twig.url.generator:
    class: Symfony\Component\Routing\Generator\UrlGenerator
    public: false
    arguments:
        - "@=service('router').getRouteCollection()"
        - "@request.context"

使用工厂

如果出于某种原因您不想使用 Symfony 表达式语言,您可以使用负责实例化您的 url 生成器的工厂类来实现。

class UrlGeneratorFactory
{
    private $router;

    private $requestContext;

    public function __construct($router, $requestContext)
    {
        $this->router = $router;
        $this->requestContext = $requestContext;
    }

    public function create()
    {
        return new UrlGenerator($this->router->getRouteCollection(), $this->requestContext);
    }
}

并在您的yaml中将 url 生成器定义设置为:

twig.url.generator.factory:
    class: UrlGeneratorFactory
    arguments: ["@router", "@request.context"]

twig.url.generator:
    class:   Symfony\Component\Routing\Generator\UrlGenerator
    factory: ["@twig.url.generator.factory", create]
于 2016-07-13T16:17:03.743 回答