Symfony 4.1树枝扩展

时间:2018-07-18 15:12:40

标签: symfony symfony4 twig-extension

在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';
}
}

1 个答案:

答案 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的类来解决此问题。