Расширение Twig не регистрирует функцию

Я пытаюсь создать новую функцию для Twig и создаю расширение Twig в Symfony2. Служба зарегистрирована и правильно внедряет контейнер (поэтому я могу сослаться на объект 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>

person Nathan Rutman    schedule 31.08.2012    source источник
comment
Можете ли вы опубликовать определение службы?   -  person Carlos Granados    schedule 01.09.2012


Ответы (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>
person Carlos Granados    schedule 04.09.2012
comment
Это сработало! Спасибо! Должно быть, я пропустил это, когда читал документы. В большинстве примеров, которые я видел, как это сделать, использовался конфигурационный файл YAML... Я был довольно сбит с толку, пытаясь перевести его в точную структуру XML. Еще раз спасибо! - person Nathan Rutman; 04.09.2012