2

我有一个带有导航栏的树枝模板,所有其他模板(页面)都包含这个模板。我有一个值,它应该等于所有页面。如何设置这个值?

我在控制器中尝试这样的事情:

public function setNotificationsAction() {
    $this->setNotifications();
    return $this->render('AcmeMyBundle::navbar.html.twig', array(
        'debts' => $this->notifications,
    ));
}

然后在模板中:

<span class="badge badge-important">
    {% render(controller('AcmeMyBundle:DebtsLoansController:setNotifications')) %}
    {{ debts }}
</span>

我想要的结果是这样的:

<span class="badge badge-important">
    3
</span>

但数字应该不同,控制器应该告诉它。

我还尝试创建一个返回值的函数并以上述方式调用它。

我也试过这个语法

{{ render(controller('AcmeMyBundle:DebtsLoansController:setNotifications')) }}

但它也不起作用。

我收到以下错误:

The function "controller" does not exist in AcmeMyBundle::navbar.html.twig at line 6

您是否知道如何实现这一点,而不必编辑每个控制器和每个模板:S 非常感谢!

4

2 回答 2

3

好吧,我建议创建自己的 Twig 扩展。围绕以下几行:

<span class="badge">
    {{ acme_notifications() }}
</span>
namespace Acme\DemoBundle\Twig\AcmeDemoExtension

class AcmeDemoExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            'acme_notifications' => new \Twig_Function_Method($this, 'getNotifications');
        );
    }

    public function getNotifications()
    {
        $notifications = ...;

        return $notifications;
    }
}

在Symfony2 文档中阅读有关创建自己的 Twig 扩展的更多信息。

于 2013-06-20T09:05:09.217 回答
2

您不需要控制器部分:

{% render "AcmeBundle:MyController:MyAction" %}

但是请注意,arender是一个贯穿整个 Symfony 生命周期的全新请求,因此如果滥用它可能会影响性能。

编辑:正如@Wouter J 指出的那样:在 Symfony 2.2 之前使用上述符号。在 Symfony 2.2 之后,必须使用以下内容:

{{ render(controller('AcmeArticleBundle:Article:recentArticles', { 'max': 3 })) }}
于 2013-06-20T08:53:17.827 回答