在我的Symfony2包中,我需要检查是否定义了一个函数(扩展名)。更具体地说,如果安装了KnpMenuBundle,我在我的包中使用那个,否则我将自己渲染插件。
我尝试了这个,但这当然不起作用:
{% if knp_menu_render() is defined %}
{# do something #}
{% else %}
{# do something else #}
{% endif %}
是否有测试/功能/过滤器来检查功能是否已定义?如果没有,是否有另一种方法来检查应用程序中是否安装了KnpMenuBundle?
答案 0 :(得分:3)
在Twig Extension中编写一个函数,用于检查是否启用了bundle。
已注册的包列表存储在kernel.bundles
参数中。
Twig扩展名已注册为服务。这意味着您可以将任何其他服务或参数传递到您的扩展程序:
<services>
<service id="acme.twig.acme_extension" class="Acme\DemoBundle\Twig\AcmeExtension">
<argument>%kernel.bundles%</argument>
<tag name="twig.extension" />
</service>
</services>
在您的Twig功能或过滤器中,您可以稍后使用您传递给分机的服务或参数。
答案 1 :(得分:1)
我有同样的需求,所以我创建了自己的扩展名:
class IsLoadedExtension extends \Twig_Extension
{
/**
* @var \Twig_Environment
*/
protected $environment;
public function initRuntime(\Twig_Environment $environment)
{
$this->environment = $environment;
}
/**
* Returns a list of functions to add to the existing list.
*
* @return array An array of functions
*/
public function getTests()
{
return array(
new \Twig_SimpleTest('loaded', [$this, 'hasExtension']),
);
}
/**
* @param string $name
* @return boolean
*/
function hasExtension($name)
{
return $this->environment->hasExtension($name);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'amce_extension_exists';
}
}
然后在Twig注册:
services:
acme_somebundle.twig.is_loaded_extension:
class: Acme\SomeBundle\Twig\IsLoadedExtension
tags: [{ name: twig.extension }]
并在像这样的树枝模板中使用它:
{% if 'knp_menu' is loaded %}
{# use knp menu #}
{% endif %}