繁体   English   中英

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

[英]How to register a Twig Extension in services.yaml?

我将细枝与Symfony2一起使用,我的项目结构为:

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

我正在遵循本文档来创建扩展,但是我发现它缺少有关名称空间,路径和注册的详细信息。 我也阅读了详细的文档,但并没有太大帮助。

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?

我的扩展名定义为:

编辑:我根据杰森·罗马的答案更正了我的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 }

bootstrap.php用以下代码加载services.yml:

$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”不存在

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

有人可以告诉我注册码的各个部分是什么,我应该使用它做什么?

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

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文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM