如何在services.yaml中注册Twig Extension?

时间:2016-02-11 16:21:57

标签: php symfony twig yaml symfony-2.3

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

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

我正在关注this documentation来创建扩展程序,但我发现它缺少有关命名空间,路径和注册的详细信息。我也经历了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:函数“genqr”不存在

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

有人可以解释一下注册码的各个部分是什么以及我应该使用它来做什么工作?

1 个答案:

答案 0 :(得分:1)

您正在声明自定义功能不正确。它应该是这样的:

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

这可确保从您的班级中调用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