检查是否定义了功能/扩展名

时间:2012-12-22 15:42:04

标签: symfony twig knpmenubundle

在我的Symfony2包中,我需要检查是否定义了一个函数(扩展名)。更具体地说,如果安装了KnpMenuBundle,我在我的包中使用那个,否则我将自己渲染插件。

我尝试了这个,但这当然不起作用:

{% if knp_menu_render() is defined %}
    {# do something #}
{% else %}
    {# do something else #}
{% endif %}

是否有测试/功能/过滤器来检查功能是否已定义?如果没有,是否有另一种方法来检查应用程序中是否安装了KnpMenuBundle?

2 个答案:

答案 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 %}