Symfony:检查授权的最佳方法是什么

时间:2017-10-08 18:35:45

标签: php symfony acl symfony-3.3 symfony-security

我有两个实体:文档 DocumentValidation

文件:

class Document
{
    ...

    /**
     * @ORM\OneToMany(
     *     targetEntity="AppBundle\Entity\DocumentValidation",
     *     mappedBy="document",
     *     cascade={"persist"}
     * )
     */
    private $validations;

DocumentValidation:

class DocumentValidation
{
    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime", nullable=true)
     * @Assert\DateTime
     */
    private $validatedAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime", nullable=true)
     * @Assert\DateTime
     */
    private $deletedAt;

每个文档都可以多次验证和删除。但是文档只能进行一次验证:验证,删除,验证,删除,验证,删除,验证......

在Twig中,我列出了所有文档。我想检查每个文档是否可以删除。 如果文档正在进行验证,则无法将其删除并隐藏删除图标

最好的方法是什么?

  • 如果我在Symfony Voter中使用带有 is_granted()的Doctrine查询来检查每个文档是否正在进行验证,那么我会有很多查询...(每个文档一个);
  • 如果我在Controller中使用LEFT JOIN(和Symfony Voter),如果我有很多控件(在下面阅读[PLEASE]),则非常困难;
  • 使用Filesystemcache创建一个类,并保存是否可以删除每个文档。在每个链接的实体操作时重新生成缓存;
  • 其他?

请记住,这种情况非常简单。在我的情况下,我有很多理由(> 10)拒绝删除或修改,几乎总是因为数据库中的关系

1 个答案:

答案 0 :(得分:0)

如果您想避免许多查询或许多控件可能是最好的解决方案,那就是在canBeDeletable实体中添加新字段Document,并为每个操作处理此字段的值对它的影响。

您可以找到一种正确的方法(通过示例使用自定义事件)。

最后,只有一个选民可以创建没有很多查询或控件,只有一个会检查这个字段的值。