在 Symfony2 中,重写 RoutingExtension 非常简单,我可以注入一些额外的参数。
我正在使用动态域路由到应用程序的不同部分。
{subdomain}.domain.com
Run Code Online (Sandbox Code Playgroud)
但是,我不想每次在 twig 中调用路径或 url 时都必须指定子域。
我可以创建自己独特的过滤器名称,但我不愿意。
以前,我们可以将其放入 services.yaml 文件中,它就可以工作。
services:
twig.extension.routing:
class: AppBundle\Twig\Extension\RoutingExtension
public: false
arguments:
- '@router'
- '@request_stack'
- '%domain%'
Run Code Online (Sandbox Code Playgroud)
使用 Symfony Flex,我得到的只是Unable to register extension "App\TwigExtension\TwigRoutingExtension" as it is already registered.
小智 1
在 SF4 中更简单:
第一的composer require symfony/twig-bundle twig/extensions
通常自动装配是启用的,所以你可以简单地执行以下操作:
<?php
namespace App\Twig;
use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class TestExtension extends RoutingExtension
{
public function __construct(UrlGeneratorInterface $generator)
{
parent::__construct($generator);
}
public function getPath($name, $parameters = array(), $relative = false)
{
return parent::getPath($name, $parameters, $relative);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想设置一个服务,忘记参数定义,这很无聊:)。假设您的%domain%
参数可用,请执行以下操作:
<?php
namespace App\Twig;
use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
class TestExtension extends RoutingExtension
{
/** @var RouterInterface $router */
protected $router;
/** @var RequestStack $stack */
protected $stack;
/** @var mixed $domain */
protected $domain;
/**
* TestExtension constructor.
*
* @param RouterInterface $router
* @param RequestStack $stack
* @param ParameterBagInterface $bag
*/
public function __construct(RouterInterface $router, RequestStack $stack, ParameterBagInterface $bag)
{
$this->router = $router;
$this->stack = $stack;
$this->domain = $bag->get('domain');
}
public function getPath($name, $parameters = array(), $relative = false)
{
return parent::getPath($name, $parameters, $relative);
}
}
Run Code Online (Sandbox Code Playgroud)