在Symfony 4.1中,我创建了一个树枝扩展名,并尝试将其用作服务
twig.extension.active.algos:
class: App\Twig\AppExtension
public: true
tags:
- { name: twig.extension, priority: 1024 }
很遗憾,我收到“无法注册扩展名“ App \ Twig \ AppExtension”,因为它已被注册” 经过多次搜索,我发现symfony 3.4版本中有一个包装袋,但是他们说错误可以解决。所以这是我的错误,或者是symfony团队的另一个错误。
我的扩展名是:
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class AppExtension extends \Twig_Extension {
public function getFunctions() {
return array(
new \Twig_SimpleFunction('get_active_algos', array($this, getActiveAlgos')),
);
}
public function getActiveAlgos()
{
return [1,2,3];
}
public function getName()
{
return 'get_active_algos';
}
}
答案 0 :(得分:3)
无聊。这是S4.1的自定义树枝功能的工作示例。不需要任何服务配置(更新:添加的$ answer参数除外)。我什至只是使用autowire注入了默认的实体管理器。
namespace App\Twig;
use Doctrine\ORM\EntityManagerInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class TwigExtension extends AbstractExtension
{
private $em;
private $answer;
public function __construct(EntityManagerInterface $em, int $answer)
{
$this->em = $em;
$this->answer = $answer;
}
public function getFunctions()
{
return array(
new TwigFunction('get_active_algos', [$this, 'getActiveAlgos']),
);
}
public function getActiveAlgos()
{
$dbName = $this->em->getConnection()->getDatabase();
return 'Some Active Algos ' . $dbName . ' ' . $answer;
}
}
更新:基于第一个注释,我更新了示例,以显示注入自动装配无法处理的缩放器参数。
# services.yaml
App\Twig\TwigExtension:
$answer: 42
请注意,仍然不需要将服务标记为扩展。 Autoconfig通过自动标记所有扩展AbstractExtension的类来解决此问题。