5

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

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

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

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

4

2 回答 2

3

在Twig 扩展中编写一个函数,该函数将检查捆绑包是否已启用。

已注册捆绑包的列表存储在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 函数或过滤器中,您稍后可以使用已传递给扩展的服务或参数。

于 2012-12-22T16:37:55.840 回答
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 %}
于 2015-02-27T18:50:07.463 回答