Twig扩展未注册功能

时间:2012-08-31 21:00:59

标签: symfony twig symfony-2.1

我正在尝试为Twig创建一个新功能,并在Symfony2中创建一个Twig扩展。该服务已注册并正在正确注入容器(因此我可以引用response对象),但它找不到该功能。

这是扩展名:

namespace MyProject\Bundle\MyBundle\Twig\Extensions;

use Twig_Extension,
    Twig_Function_Method;

use Symfony\Component\DependencyInjection\ContainerAwareInterface,
    Symfony\Component\DependencyInjection\ContainerInterface;


class TwigUiExtensions extends Twig_Extension implements ContainerAwareInterface
{
    protected $container;

    public function setContainer(ContainerInterface $container = NULL)
    {
        $this->container = $container;
        return $this;
    }

    public function getContainer()
    {
        return $this->container;
    }

    public function getFunctions()
    {
        return array(
            'defaultBodyClasses'    =>  new Twig_Function_Method($this, 'defaultBodyClassesFunction')
        );
    }

    private function _getControllerName()
    {
        $pattern = "#Controller\\\([a-zA-Z]*)Controller#";
        $matches = array();
        preg_match($pattern, $this->getContainer()->request->get('_controller'), $matches);
        return strtolower($matches[1]);
    }

    private function _getActionName()
    {
        $pattern = "#::([a-zA-Z]*)Action#";
        $matches = array();
        preg_match($pattern, $this->getContainer()->request->get('_controller'), $matches);
        return $matches[1];
    }

    public function defaultBodyClassesFunction($userClasses = NULL)
    {
        $classes = array();
        $classes[] = $this->_getControllerName();
        $classes[] = $this->_getActionName();
        if ($userClasses) {
            $classes[] = $userClasses;
        }
        return join(' ', $classes);
    }

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

在我的Twig文件中,当我调用defaultBodyClasses()时,Symfony正在给我一个错误:The function "defaultBodyClasses" does not exist并引用我正在调用该函数的Twig文件。

任何想法可能会发生什么?

谢谢, 内特


编辑:

这是服务定义:

<parameters>
    <parameter key="myproject.twig.extensions.ui_extensions.class">MyProject\Bundle\MyBundle\Twig\Extensions\TwigUiExtensions</parameter>
</parameters>

<services>
    <service id="myproject.twig.extensions.ui_extensions" class="%myproject.twig.extensions.ui_extensions.class%">
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>
</services>

1 个答案:

答案 0 :(得分:1)

您忘了指定此服务是Twig扩展名:

<parameters>
    <parameter key="myproject.twig.extensions.ui_extensions.class">MyProject\Bundle\MyBundle\Twig\Extensions\TwigUiExtensions</parameter>
</parameters>

<services>
    <service id="myproject.twig.extensions.ui_extensions" class="%myproject.twig.extensions.ui_extensions.class%">
        <tag name="twig.extension" />
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>
</services>