【问题标题】:Symfony : What is the best method for check authorizationSymfony:检查授权的最佳方法是什么
【发布时间】:2018-03-19 23:13:30
【问题描述】:

我有两个实体:DocumentDocumentValidation

文档:

class Document
{
    ...

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

文档验证:

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

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

【问题讨论】:

  • 为什么要把事情复杂化?你不能只检查validatedAt > deletedAt 是否显示删除图标(因为实体已经过验证,现在可以删除),否则隐藏?

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


【解决方案1】:

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

您可以找到一种正确执行此操作的方法(以自定义事件为例)。

最后,将只创建一个投票者,无需太多查询或控件,只有一个会检查该字段的值。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2010-09-09
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多