0

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>
4

1 に答える 1

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>
于 2012-09-04T12:40:06.133 に答える