Twig/PHP 显示作者的数据 - 2 个表 (Symfony2)
Twig/PHP Displaying data by the author - 2 tables (Symfony2)
我对 Symfony 比较陌生,有一个问题我无法解决。
twig 视图中的 for 用于 "enquiry" 实体,试图通过查询控制器将作者从 "post" 实体传递到视图。希望这是有道理的。
控制器:
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 %}
本质上,我试图仅在作者登录的用户时才显示数据库中的数据。
谢谢。
您的变量 $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 %}
@davidvelilla 循环查询项目的代码更有意义,并检查项目作者是否与登录用户相同,这将仅显示已连接用户的项目,您可以做的其他事情是使用有意义的项目和用户或用户和作者之间的存储库或关系。然后使用存储库中的函数通过 user_id 获取项目,您将不必遍历所有项目,这是不好的做法并占用资源。
例如,您在数据库中有 1000 个项目,您有一个用户有 1 个项目。为什么从数据库 1000 个项目加载并循环它们以检查 user == author 而你可以做 $repository->getProjectsById($user->getId());
// 只加载需要的 $projects(1) 而不需要 twig 检查。仅显示数据
一个更普遍的尝试是使用 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
}
// ...
}
除了 "User is Author" 检查之外,您还可以添加其他规则。
也许您希望 ROLE_SUPER_ADMIN 的用户始终看到所有内容。
只需将此添加到您的选民 class.
我对 Symfony 比较陌生,有一个问题我无法解决。
twig 视图中的 for 用于 "enquiry" 实体,试图通过查询控制器将作者从 "post" 实体传递到视图。希望这是有道理的。
控制器:
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 %}
本质上,我试图仅在作者登录的用户时才显示数据库中的数据。
谢谢。
您的变量 $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 %}
@davidvelilla 循环查询项目的代码更有意义,并检查项目作者是否与登录用户相同,这将仅显示已连接用户的项目,您可以做的其他事情是使用有意义的项目和用户或用户和作者之间的存储库或关系。然后使用存储库中的函数通过 user_id 获取项目,您将不必遍历所有项目,这是不好的做法并占用资源。
例如,您在数据库中有 1000 个项目,您有一个用户有 1 个项目。为什么从数据库 1000 个项目加载并循环它们以检查 user == author 而你可以做 $repository->getProjectsById($user->getId());
// 只加载需要的 $projects(1) 而不需要 twig 检查。仅显示数据
一个更普遍的尝试是使用 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
}
// ...
}
除了 "User is Author" 检查之外,您还可以添加其他规则。 也许您希望 ROLE_SUPER_ADMIN 的用户始终看到所有内容。 只需将此添加到您的选民 class.