我在Twig Extension中有一个slugify方法,我想在某些情况下在控制器中使用,f.e带有重定向。
有一个简单的方法吗?
我如何从控制器中的Twig Extensions访问函数?
或者我是否必须将slugify方法作为帮助才能在代码和树枝中使用它?
答案 0 :(得分:7)
我建议创建一般服务并将其注入Twig扩展。扩展将作为服务的包装器。
namespace Acme\Bundle\DemoBundle\...;
class MyService
{
public function myFunc($foo, $bar)
{
// some code...
}
// additional methods...
}
编辑 - 如Squazic所述,第一个参数必须实现Twig_ExtensionInterface
。一个不优雅的解决方案是向MyTwigExtension
添加方法,然后在服务中调用相应的方法。
namespace Acme\Bundle\DemoBundle\Twig\Extension;
class MyTwigExtension extends \Twig_Extension
{
protected $service;
public function __construct(MyService $service)
{
$this->service = $service;
}
public function getFunctions()
{
return array(
'myTwigFunction' => new \Twig_Function_Method($this, 'myFunc'),
'mySecondFunc' => new \Twig_Function_Method($this, 'mySecondFunc'),
);
}
public function myFunc($foo, $bar)
{
return $this->service->myFunc($foo, $bar);
}
// etc...
}
答案 1 :(得分:7)
我认为有两种解决方案,两者都应该使用Twig_Function_Method
类。
已发布的第一个解决方案gilden
是将逻辑封装到服务中并为Twig扩展创建一个包装器。
另一种解决方案是仅使用Twig Extension。 Twig Extensino已经是一项服务,您必须将其定义为具有特殊<tag name="twig.extension" />
的服务。
但它也是一种服务,您可以通过服务容器获取该实例。并且还可以注入其他服务:
所以你有你的Twig扩展/服务:
class MyTwigExtension extends \Twig_Extension
{
private $anotherService;
public function __construct(SecurityService $anotherService= null)
{
$this->anotherService = $anotherService;
}
public function foo($param)
{
// do something
$this->anotherService->bar($param);
}
public function getFunctions()
{
// function names in twig => function name in this calss
return array(
'foo' => new \Twig_Function_Method($this, 'foo'),
);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'my_extension';
}
}
services.xml看起来像这样
<service id="acme.my_extension" class="Acme\CoreBundle\Twig\Extension\MyTwigExtension">
<tag name="twig.extension" />
<argument type="service" id="another.service"></argument>
</service>
要从控制器获得服务,您只需使用它:
$this->container->get('acme.my_extension')
注意普通服务的唯一区别是,树枝扩展名不是延迟加载的(http://symfony.com/doc/current/cookbook/templating/twig_extension.html#register-an-extension-as-a-service)
答案 2 :(得分:1)
或者另一种方法是通过树枝获取它(这是在Symfony 2.7上)
$twigExt = $this->container->get('twig')->getExtension(TwigExtensionClassName::class);
因此,如果您的Twig扩展类称为“ MyFabulousTwigExt”,那么您将致电
$twigExt = $this->container->get('twig')->getExtension(MyFabulousTwigExt::class);
当上述方法不起作用(我们的扩展程序也不是一项服务)时,这对我有用