我正在开发第三方软件包。
我需要定义一个可以在此包的twig模板中使用的变量。
当我尝试在我的bundle config.yml模式中声明变量在我的项目上执行twig模板时,
twig:
globals:
test_vars: %test_vars%
我收到此错误。
InvalidArgumentException in YamlFileLoader.php line 357:
There is no extension able to load the configuration for "twig" (in /home/domain.ext/vendor/test/test-bundle/test/TestBundle/DependencyInjection/../Resources/config/.yml). Looked for namespace "twig", found none
非常感谢
解决方案代码,感谢@ alexander.polomodov和@mblaettermann
GlobalsExtension.php
namespace Vendor\MyBundle\Twig\Extension;
class GlobalsExtension extends \Twig_Extension {
public function __construct($parameter) {
$this->parameter= $parameter;
//...
}
public function getGlobals() {
return array(
'parameter' => $this->parameter
//...
);
}
public function getName() {
return 'MyBundle:GlobalsExtension';
}
}
my.yml
services:
twig.extension.globals_extension:
class: Vendor\MyBundle\Twig\Extension\GlobalsExtension
arguments: [%my.var%]
tags:
- { name: twig.extension }
my.html.twig
my parameter: {{ parameter }}
答案 0 :(得分:2)
你应该使用依赖注入在你自己的bundle中完全实现这个逻辑。这意味着,不要劫持twig:
配置密钥,而是使用您自己的捆绑配置密钥。
在Bundles Container Extension中,您可以将配置值传递给容器参数,然后将这些参数作为构造函数参数传递给Twig Extension。
然而,在Alex已经指出将Twig Extension添加到容器之前,您需要检查Twig Bundle是否已加载并且可用。
http://symfony.com/doc/current/cookbook/templating/twig_extension.html
答案 1 :(得分:0)
我有相同的情况(将自己的bundle config值传递到树枝模板),我的实际工作解决方案是在我的bundle扩展名中将config值作为全局树枝传递:
1-捆绑软件的扩展名应该扩展PrependExtensionInterface,请参见https://symfony.com/doc/current/bundles/prepend_extension.html
2-您可以执行prepend方法:
public function prepend(ContainerBuilder $container)
{
// get configuration from config files
$configs = $container->getExtensionConfig($this->getAlias());
$config = $this->processConfiguration(new Configuration(), $configs);
// put your config value in an array to be passed in twig bundle
$twigGlobals = [
'globals' => [
'my_global_twig_variable_name' => $config['myConfigKey'],
],
];
// pass the array to twig bundle
$container->prependExtensionConfig('twig', $twigGlobals);
}
然后,您可以在树枝中使用my_global_twig_variable_name。