Symfony 4.1 树枝扩展

Symfony 4.1 twig extension

在 Symfony 4.1 中,我创建了一个 twig 扩展,并尝试将其用作服务

twig.extension.active.algos:
    class: App\Twig\AppExtension
    public: true
    tags:
        - { name: twig.extension, priority: 1024 }

不幸的是我收到了'Unable to register extension "App\Twig\AppExtension" as it is already registered' 经过多次搜索,我看到 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';
}
}

觉得无聊。这是 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.

的 类 来解决这个问题。