如何在 services.yaml 中注册 Twig 扩展?

How to register a Twig Extension in services.yaml?

我在 Symfony2 中使用 twig,我的项目结构是:

/myprojectroot
    /app
        /config
            services.yml
        bootstrap.php
    /src
        /Foo
            /Bar
                /Util
                    myextension.php

我正在关注 this documentation to create my extension, but I find that it's lacking details about namespaces, paths and the registration. I also went through the detailed doc,但没有太大帮助。

services:
    app.twig_extension:  <---What is this line? Just a name? 
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension } <--- Should I ever change that?

我的分机定义为:

编辑:我根据 Jason Roman 的回答更正了我的 getFunctions(),但错误仍然存​​在。

namespace Foo\Bar\Util;        

class QrCodeHandler extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
                new \Twig_SimpleFunction('genqr', 'generateQRcode'),
        );
    }

    public function generateQRcode($data)
    {
        //snip code...
    }

    public function getName()
    {
        return 'qr_extension';
    }
}

和我的 services.yaml:

services:
  qr_extension:
        class: Foo\Bar\Util\QrCodeHandler
        public: false
        tags:
            - { name: twig.extension }

services.yml 由 bootstrap.php 使用此代码加载:

$services = $parser->parse(__DIR__ . '/config/services.yml');

if (isset($services['services']))
{
    foreach ( $services['services'] as $name => $class )
    {
        $app['service.' . $name] = $app->share(function (Application $app) use($class) {
            $service = new $class($app);
            if (!$service instanceof ServiceInterface)
            {
                $errorMessage = get_class($service) . ' must implement ServiceInterface.';
                $app['monolog']->addError($errorMessage);
                throw new \Exception($errorMessage);
            }

            return $service;
        });
    }
}

我当然会问,因为我遇到了错误

Twig_Error_Syntax: The function "genqr" does not exist

所以我想知道出了什么问题。我想问题是我如何注册它。

谁能给我解释一下注册码的各个部分是什么,我应该用什么来让它工作?

您错误地声明了您的自定义函数。应该是这样的:

public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction('genqr', array($this, 'generateQRcode')),
    );
}

这可确保从您的 class 中调用 generateQRcode 方法。关于你的其他问题:

services:
    app.twig_extension:  <---What is this line? Just a name?

是的,这只是服务的名称。请确保此名称是唯一的。

    tags:
        - { name: twig.extension } <--- Should I ever change that?

不,你永远不会改变它。见 Symfony documentation for tagged services.