首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在自定义Twig扩展中使用Twig

在自定义Twig扩展中使用Twig
EN

Stack Overflow用户
提问于 2013-02-02 05:01:18
回答 1查看 5.5K关注 0票数 1

在一个Symfony2项目中,我创建了一个实现Twig_ExtensionInterface的服务,这样我就可以像{{ stuff|my_filter }}一样将它用作一个Twig过滤器

在这个服务中,我需要使用twig环境,这样我就可以使用twig模板,所以我像在服务中一样注入了它:

在services.yml中:

代码语言:javascript
复制
services:
    meta.twig.my_extension:
        class: Acme\GeneralBundle\Twig\MyExtension
        tags:
            - { name: twig.extension }
        arguments:
            twig: "@twig"

因此,服务本身看起来像这样:

代码语言:javascript
复制
<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{

    public function __construct($twig)
    {
        $this->twig = $twig;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->twig->render($someTemplate,$someArguments);
    }
}

我可以在控制器中使用它,就像这样:

代码语言:javascript
复制
$myService = $this->container->get('Acme.twig.my_extension');
$text = $myService->myFunction($someValue);

但是,当然,我在这样做的时候得到了一个CircularReference错误:

代码语言:javascript
复制
Circular reference detected for service "Acme.twig.my_extension", 
path: "Acme.twig.my_extension -> twig".

那么,在自定义Twig过滤器中使用twig->render()函数的最佳方式是什么?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-02-03 03:57:23

Twig_ExtensionInterface定义了initRuntime()方法,该方法接受twig环境作为参数。此方法由twig在初始化扩展时调用。

您已经扩展了already provides an empty implementation of this methodTwig_Extension类。您所要做的就是覆盖它,并存储对twig环境的引用以供将来使用。

代码语言:javascript
复制
<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{
    private $environment = null;

    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->environment->render($someTemplate,$someArguments);
    }
}

文档:Creating an extension

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14654963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档