在使用preRemove删除entiry之前进行检查

时间:2017-10-17 12:12:33

标签: php symfony doctrine

我有一个实体学生,主题有作业。不幸的是,映射很奇怪,我现在不允许改变它,但是作业知道它们属于哪个科目,而且科目知道他们属于哪个学生,而不是相反。学生不知道其科目,其科目不知道其作业。我还有更多onDelete = CASCADE“所以默认情况下,学生将被删除,其主题与他们的作业一样。这样就可以了。

我想创建一张支票,如果学生的作业是开放作业,学生不能删除,也不是主题。

如果没有开放主题,我想删除学生,科目和作业。

我该怎么做?我想我已经有了这样的骨干;

    public function preRemove(LifecycleEventArgs $args)
    {
        $em = $args->getEntityManager();
        $student = $args->getEntity();

        if ($student instanceof Student) {
            $subjects = $em->getRepository(Subject::class)->findBy(['student' => $student]);

            foreach ($subjects as $subject) {
                if ($subject instanceof Subject) {
                    $assignments = $em->getRepository(Assignment::class)->findBy(['subject' => $subjects]);

                    foreach ($assignments as $assignment) {
                        if ($assignment->isCompleted()) {
                            echo $assignment." - CAN DELETE<br>";
                        } else {
                            echo $assignment." - CAN'T DELETE, THERE ARE OPEN ASSIGNMENTS!<br>";
                        }
                    }
                }
            }
        }
    }

现在什么是正确的方法?只返回true或false来停止或继续操作?或者我是否需要再次执行特定的Doctrine内容,例如删除等。我不是100%确定下一步该做什么。

如果无法删除作业,我还需要创建自定义例外。

有人可以帮忙吗?我会非常感激。

1 个答案:

答案 0 :(得分:0)

我更喜欢创建服务并在每次需要检查此类操作时使用它。遗憾的是,教义事件和听众过于复杂,并且在很长一段时间内会带来更多有益的问题。当然,如果你这样做&#34;手动&#34;,你必须确保每次都将该控件委托给该服务,并且永远不要手动删除这些对象。此外,拥有一项服务可以使您的代码与ORM本身的联系更少。

顺便看看你的代码那里没有&#34;银弹回答&#34;对于这个,但我更喜欢Exception(你的自定义类型),你需要知道发生了什么错误