9

我的应用程序显示项目列表、项目详细信息页面和用于编辑这些项目的表单。这些是路线:

  • / - 项目列表
  • /project/42 - 查看项目(项目详细信息页面)
  • /project/42/edit - 编辑项目

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

我已经实施了一个 Voter 来防止非所有者访问 /project/42/edit。

现在,我还想从项目详细信息页面中隐藏“编辑项目”链接。这样做的方法是什么?理想情况下,在 Twig 中,我想做类似的事情

{% if may_access(path('project_edit', { 'id': project.id })) %}
  <a href="{{ path('project_edit', { 'id': project.id }) }}">编辑项目</a>
{% 万一 %}

我可以将此功能实现为 Twig 扩展,但可能已经存在类似的功能。

4

1 回答 1

11

函数 is_granted() 实际上有第二个参数,它允许我做我需要的事情:

{% if is_granted("MAY_EDIT", 项目) %}
  <a href="{{ path('project_edit', { 'id': project.id }) }}">编辑项目</a>
{% 万一 %}

我将它与控制器操作中的检查结合使用:

公共功能editAction(项目$项目)
{
    if (!$this->get('security.context')->isGranted('MAY_EDIT', $project)) {
        $this->flash('你不能编辑这个项目');
        返回 $this->show($project);
    }
    // ...
}

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

如果你想看看完整的代码,它在我在 github 上发布的教程项目中。

于 2013-06-13T11:07:32.827 回答