如何在 services.yaml 中注册 Twig 扩展?
How to register a Twig Extension in services.yaml?
我在 Symfony2 中使用 twig,我的项目结构是:
/myprojectroot
/app
/config
services.yml
bootstrap.php
/src
/Foo
/Bar
/Util
myextension.php
我正在关注 this documentation to create my extension, but I find that it's lacking details about namespaces, paths and the registration. I also went through the detailed doc,但没有太大帮助。
services:
app.twig_extension: <---What is this line? Just a name?
class: AppBundle\Twig\AppExtension
public: false
tags:
- { name: twig.extension } <--- Should I ever change that?
我的分机定义为:
编辑:我根据 Jason Roman 的回答更正了我的 getFunctions(),但错误仍然存在。
namespace Foo\Bar\Util;
class QrCodeHandler extends \Twig_Extension
{
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('genqr', 'generateQRcode'),
);
}
public function generateQRcode($data)
{
//snip code...
}
public function getName()
{
return 'qr_extension';
}
}
和我的 services.yaml:
services:
qr_extension:
class: Foo\Bar\Util\QrCodeHandler
public: false
tags:
- { name: twig.extension }
services.yml 由 bootstrap.php 使用此代码加载:
$services = $parser->parse(__DIR__ . '/config/services.yml');
if (isset($services['services']))
{
foreach ( $services['services'] as $name => $class )
{
$app['service.' . $name] = $app->share(function (Application $app) use($class) {
$service = new $class($app);
if (!$service instanceof ServiceInterface)
{
$errorMessage = get_class($service) . ' must implement ServiceInterface.';
$app['monolog']->addError($errorMessage);
throw new \Exception($errorMessage);
}
return $service;
});
}
}
我当然会问,因为我遇到了错误
Twig_Error_Syntax: The function "genqr" does not exist
所以我想知道出了什么问题。我想问题是我如何注册它。
谁能给我解释一下注册码的各个部分是什么,我应该用什么来让它工作?
您错误地声明了您的自定义函数。应该是这样的:
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('genqr', array($this, 'generateQRcode')),
);
}
这可确保从您的 class 中调用 generateQRcode
方法。关于你的其他问题:
services:
app.twig_extension: <---What is this line? Just a name?
是的,这只是服务的名称。请确保此名称是唯一的。
tags:
- { name: twig.extension } <--- Should I ever change that?
不,你永远不会改变它。见 Symfony documentation for tagged services.
我在 Symfony2 中使用 twig,我的项目结构是:
/myprojectroot
/app
/config
services.yml
bootstrap.php
/src
/Foo
/Bar
/Util
myextension.php
我正在关注 this documentation to create my extension, but I find that it's lacking details about namespaces, paths and the registration. I also went through the detailed doc,但没有太大帮助。
services:
app.twig_extension: <---What is this line? Just a name?
class: AppBundle\Twig\AppExtension
public: false
tags:
- { name: twig.extension } <--- Should I ever change that?
我的分机定义为:
编辑:我根据 Jason Roman 的回答更正了我的 getFunctions(),但错误仍然存在。
namespace Foo\Bar\Util;
class QrCodeHandler extends \Twig_Extension
{
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('genqr', 'generateQRcode'),
);
}
public function generateQRcode($data)
{
//snip code...
}
public function getName()
{
return 'qr_extension';
}
}
和我的 services.yaml:
services:
qr_extension:
class: Foo\Bar\Util\QrCodeHandler
public: false
tags:
- { name: twig.extension }
services.yml 由 bootstrap.php 使用此代码加载:
$services = $parser->parse(__DIR__ . '/config/services.yml');
if (isset($services['services']))
{
foreach ( $services['services'] as $name => $class )
{
$app['service.' . $name] = $app->share(function (Application $app) use($class) {
$service = new $class($app);
if (!$service instanceof ServiceInterface)
{
$errorMessage = get_class($service) . ' must implement ServiceInterface.';
$app['monolog']->addError($errorMessage);
throw new \Exception($errorMessage);
}
return $service;
});
}
}
我当然会问,因为我遇到了错误
Twig_Error_Syntax: The function "genqr" does not exist
所以我想知道出了什么问题。我想问题是我如何注册它。
谁能给我解释一下注册码的各个部分是什么,我应该用什么来让它工作?
您错误地声明了您的自定义函数。应该是这样的:
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('genqr', array($this, 'generateQRcode')),
);
}
这可确保从您的 class 中调用 generateQRcode
方法。关于你的其他问题:
services:
app.twig_extension: <---What is this line? Just a name?
是的,这只是服务的名称。请确保此名称是唯一的。
tags:
- { name: twig.extension } <--- Should I ever change that?
不,你永远不会改变它。见 Symfony documentation for tagged services.