我在代码中使用了Twig和Symfony路由,我想使用Symfony Twig桥与Twig进行集成。
我已经安装了它们,我需要做的是添加到Twig扩展Symfony\Bridge\Twig\Extension\RoutingExtension,这需要Symfony\Component\Routing\Generator\UrlGenerator.。
UrlGenerator需要两个参数:
因此,在我的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'不幸的是,@路由器不是路由收集类型。它有getRouteCollection方法,允许获取UrlGenerator所需的数据,如果我手动添加扩展,它就能工作。从控制员那里。但是我不想将服务定义分割到不同的文件中,而希望将它们保留在yaml服务定义中。
,所以问题是:如何将参数传递给UrlGenerator,而不是原始对象路由器,而是getRouteCollection的结果?
发布于 2016-07-13 16:17:03
有多种方法可以做到这一点:
使用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]https://stackoverflow.com/questions/38355572
复制相似问题