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>