【问题标题】:Twig/PHP Displaying data by the author - 2 tables (Symfony2)Twig/PHP 由作者显示数据 - 2 个表 (Symfony2)
【发布时间】:2015-03-26 18:48:55
【问题描述】:

我对 Symfony 比较陌生,有一个我无法解决的问题。

twig 视图中的 for 用于“查询”实体,试图通过查询控制器将作者从“发布”实体传递到视图。希望这是有道理的。

控制器:

public function viewEnquireAction($id )
{
    $em = $this->getDoctrine()->getManager();
    $enquire = $em->getRepository('Bundle:Enquire')->find($id);

    $project = new Post();
    $author = $project->getAuthor(); //mutator from Post entity

    return $this->render('Bundle:Page:staff.html.twig', ['enquire' => $enquire, 'author' => $author]);
}

树枝:

{% for project in enquire %}
    {% if app.user == author.username %} //issue here.
        //return data will go here
    {% endif %}
{% endfor %}

本质上,我试图仅在作者登录的用户时才显示数据库中的数据。

谢谢。

【问题讨论】:

    标签: php symfony doctrine twig


    【解决方案1】:

    @davidvelilla 在查询中循环遍历项目的代码更有意义,然后检查项目作者是否与登录用户相同,这将只显示连接用户的项目,您可以做的其他事情是使用有意义的项目与用户或用户与作者之间的存储库或关系。然后使用存储库中的函数通过 user_id 获取项目,您不必遍历所有项目,这是不好的做法并会占用资源。

    例如,您在数据库中有 1000 个项目,您的用户有 1 个项目。为什么从数据库 1000 项目加载并循环它们以检查用户是否 == 作者,而您可以执行 $repository->getProjectsById($user->getId()); // 仅加载所需的 $projects (1) 而无需进行树枝检查。只显示数据。

    【讨论】:

      【解决方案2】:

      使用 voters 可以让您在应用中的任何地方重复使用“允许作者查看”代码的更一般的尝试: http://symfony.com/doc/current/cookbook/security/voters_data_permission.html

      您可以保留现有的循环,但不是直接比较用户,而是可以使用以下内容:

      {% if is_granted("LIST", project) %}
        <a href="{{ path('project_edit', { 'id': project.id }) }}">show project</a>
      {% endif %}
      

      如前所述,一个优点是您还可以在其他任何地方使用它,例如在控制器内部:

      public function editAction(Project $project)
      {
          if (!$this->get('security.context')->isGranted('LIST', $project)) {
              // Throw access denied exception
          }
          // ...
      }
      

      除了“用户是作者”检查之外,您还可以添加其他规则。 也许您希望拥有 ROLE_SUPER_ADMIN 的用户始终可以看到所有内容。 只需将此添加到您的选民类。

      【讨论】:

        【解决方案3】:

        您的变量 $project 刚刚被实例化,除了您在 Post.php 中定义的默认值之外,将不包含有关 $author 的任何信息

        如果您的 $enquire 实体具有正确的映射信息,则只需将该变量传递给模板,我认为您正在尝试获取该查询的所有项目的作者。这样的事情可能会给你一个线索:

        public function viewEnquireAction($id )
        {
            $em = $this->getDoctrine()->getManager();
            $enquire = $em->getRepository('Bundle:Enquire')->find($id);
        
            return $this->render('Bundle:Page:staff.html.twig', ['enquire' => $enquire]);
        }
        
        {% for project in enquire.projects %}
            {% if app.user == project.author.username %} //issue here.
                //return data will go here
            {% endif %}
        {% endfor %}
        

        【讨论】:

        • 我没有映射,因为作者映射到另一个实体中的另一个字段,可以多个实体映射吗?感谢您的回复。
        • 我不知道您需要使用的信息结构。但是对于我在您的代码中看到的内容,您执行 $project = new Post();然后 $author = $project->getAuthor();这将使“作者”变量包含 Post 实体的默认信息。这肯定不是你想要得到的,是吗?
        • 排序,这样我应该可以访问作者列表,如果登录的用户是作者,则显示相关查询。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多