使用 Symfony Twig Bridge 集成 Symfony 路由和 Twig
Integrating Symfony Routing and Twig using Symfony Twig Bridge
我在我的代码中使用了 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 服务定义中。
所以问题是:如何将 getRouteCollection 的结果而不是原始对象 Router 作为参数传递给 UrlGenerator?
有多种方法可以做到这一点:
使用 Symfony 表达式语言
如果您安装了 Symfony 表达式语言组件,您可以在您的服务定义中执行此操作:
twig.url.generator:
class: Symfony\Component\Routing\Generator\UrlGenerator
public: false
arguments:
- "@=service('router').getRouteCollection()"
- "@request.context"
使用工厂
如果出于某种原因您不想使用 Symfony 表达式语言,您可以使用工厂 class 来实现,它负责实例化您的 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]
我在我的代码中使用了 Twig 和 Symfony 路由,我想使用 Symfony Twig Bridge 将其与 Twig 集成。
我已经安装了它们,我需要做的是添加到需要 Symfony\Component\Routing\Generator\UrlGenerator.
的 Twig 扩展 Symfony\Bridge\Twig\Extension\RoutingExtensionUrlGenerator 需要 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 服务定义中。
所以问题是:如何将 getRouteCollection 的结果而不是原始对象 Router 作为参数传递给 UrlGenerator?
有多种方法可以做到这一点:
使用 Symfony 表达式语言
如果您安装了 Symfony 表达式语言组件,您可以在您的服务定义中执行此操作:
twig.url.generator:
class: Symfony\Component\Routing\Generator\UrlGenerator
public: false
arguments:
- "@=service('router').getRouteCollection()"
- "@request.context"
使用工厂
如果出于某种原因您不想使用 Symfony 表达式语言,您可以使用工厂 class 来实现,它负责实例化您的 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]