避免在父模板的控制器中重复相同的查询

Avoid repeating the same query in controllers for parent template

我正在尝试制作消息系统,但遇到了一个小问题。我有一个更大的模板来显示我的菜单和内容。菜单包括新消息条数,内容可以是任意页面(写新消息、收件箱、已发送)。

问题是我必须通过将新收到的消息的数量传递给每个小模板来呈现每个小模板,每次都调用原则并重复代码。有什么办法可以只把号码传给父模板吗?

这是我的模板:

这是包含给我带来问题的 newmsg 变量的父级。

{% extends "::base.html.twig" %}

{% block body %}

    <a href="{{ path('private_message_inbox') }}">  inbox</a>  : {{ newmsg }}
    <a href="{{ path('private_message_sent') }}">sent</a>
    <a href="{{ path('private_message_new') }}">compose</a>

{% endblock body %}

这是子模板的示例:

{% block body %}
    {{ parent() }}

    {% if messageList %}
        {% for message in messageList %}
            <li><a href="{{ path('private_message_view',{'msg': message.id}) }}">title</a> = {{ message.title|e }}</li>
            <li>cont= {{ message.content|e }}</li>
            <li>data= {{ message.date|date('d-m-Y H:m:s') }}</li>
            <li>sender= {{ message.sender|e }}</li>
            <hr>
        {% endfor %}
    {% else %}
        <div>no messages</div>
    {% endif %}
{% endblock body %}

问题是每个子模板都要求我提供 newmsg 变量

$messages = $this->getDoctrine()->getRepository('MedAppCrudBundle:Message');
    $newMessagesNo = count($messages->findBy(array('seen' => '0', 'receiver' => $this->getUser())));
    return $this->render(
        'MedAppCrudBundle:UserBackend\Message:new.html.twig',
        array(
            'form' => $form->createView(),
            'newmsg' => $newMessagesNo,
        )
    );

而且我必须在每个控制器中都写这个。有什么办法可以缩短这个问题吗?

您可以实施返回 newmsg 值的服务,并在您的父模板上调用它。那么就不需要传递变量了。

您可以在您的捆绑包 services.yml 中添加一项服务,例如:

 services:
     newmessages:
         class: Full\Class\Name\NewMessagesService
         arguments: ["@doctrine.orm.entity_manager"]

然后,实施 Full\Class\Name\NewMessagesService class。请记住,此 class 将需要一个接收 EntityManager 参数的构造函数。类似于:

  <?php
  namespace Full\Class\Name;
  class NewMessagesService{
     private $entityManager;

     public function __construct($entityManager){
         $this->entityManager = $entityManager;
     }

     public function methodToCalculate(){
          //Perform calculation and return result
     }
 }

然后,在您的父模板中,将 {{newmsg} 替换为:

 {{ newmessages.methodToCalculate() }}