我想了解如何使用 Doctrine 和 Symfony 进行安全的“测试和设置”操作。
我正在建立一个会议安排系统。我有一个实体叫
会议时间,老师和学生
MeetingTime 与 Student 具有可空的多对一关系,与 Teacher 具有多对一关系。
我想强制仅当正确当前为空时才能保存 meetingTime 的学生属性。即,一个学生不应该能够覆盖另一个学生。第一个预定时间的学生获胜。似乎交易会做到这一点。
我正在这样做:
$saved = true;
try
{
$em->transactional(function($em) use($mtId, $student) {
$mt = $em->getRepository('MyBundle:MeetingTime')->find($mtId);
if (is_null($mt->getStudent()))
{
$mt->setStudent($student);
$em->persist($mt);
}
else
{
throw new Exception();
}
});
}
catch(Exception $e)
{
$saved = false;
}
if (!$saved)
{
// flash "Sorry,, somebody else just grabbed that time".
}
如果花费时间,我的 UI 将通过在页面上不显示“这次预订”按钮来应对大部分情况,但当然,如果两个人同时进行操作,数据库拥有最终决定权。
这似乎可行,但这是正确的方法吗?交易安全吗?
我首先使用一个额外的“预订”实体来实现它,该实体与 MeetingTime 一对一,与 Student 多对一,并且对 MeetingTime 有一个独特的约束。这行得通,但是将 Student 作为 MeetingTime 的属性会更好,因为我还希望 MeetingTime 对 Student 和 Teacher 的组合具有独特的约束,因为学生只能与老师预订一次会议。
我知道我可能应该创建自己的 Exception 类,以便知道异常的类型。如果已经设置了正确的学生,我也应该让它感到高兴。
如果重要,数据库是 PostgreSQL。我确信这可以通过触发器非常有效地完成,但是......那是我没有进入的整个世界,保持这个数据库不可知论会很好。
谢谢