2013-06-13 60 views
8

我的应用程序显示项目列表,项目详细信息页面和表单以编辑这些项目。这些路线:Symfony2:如何根据权限隐藏Twig中的链接

  • /- 项目列表
  • /项目/ 42 - 视图项目(项目详细信息页)
  • /项目/ 42 /编辑 - 编辑项目

只有其所有者可以编辑一个项目。

我已经实施了一个选举器来阻止非业主访问/ project/42/edit。

现在,我还想从项目详细信息页面隐藏“编辑项目”链接。怎么做才能做到这一点?理想情况下,嫩枝,我愿做这样

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

的东西,我可以实现这个功能作为一个枝条延伸,但也许类似的功能已经存在。

回答

10

功能is_granted()实际上has a second parameter,允许我只是做我需要:

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

我已经使用这个与控制器动作的检查:

 
public function editAction(Project $project) 
{ 
    if (!$this->get('security.context')->isGranted('MAY_EDIT', $project)) { 
     $this->flash('You are not allowed to edit this project'); 
     return $this->show($project); 
    } 
    // ... 
} 

这是实际上与nifr在回答Sonata User - Security on custom field时使用的方法非常相似。我希望能找到一种方法让选民自动被调用并避免调用isGranted()。

如果你想看看完整的代码,它是在教程项目我有published in github

+2

请注意,任何人都可以网址破解。确保你的控制器也有适当的重定向。 – Lighthart

+0

不错的工作。有一点需要注意,如果'$ this-> show($ project);'只返回与项目页面(/ project/42)相同的视图。最好使用302重定向到该路线。 – Paulpro

+0

啊,对不起,我这 - $>显示($项目),实际上只是一个小帮手,做返回$这个 - >重定向($这个 - > generateUrl(“project_show”,阵列(“身份证” => $项目 - >的getId()))); – Olav

相关问题