我们正在使用Symfony 2.3和Doctrine来管理实体。
假设我们有一个名为“Task”的实体,用户可以像往常一样使用Symfony表单构建器创建,并且可以使用Doctrine持久化。例如,“任务”可能是在某个特定日期发送一些电子邮件的指令。假设“任务”具有称为“状态”的属性。已正确创建的“任务”可能具有“就绪”状态。
cron作业定期调用symfony Custom Command来检查是否有任何需要处理的“任务”(即状态为“Ready”),如果发现任何“任务”,它会执行一些操作,然后将实体更新为状态为“已完成”。
一旦任务被处理并且其状态被设置为“已完成”,有没有办法使实体有效地“只读”?通过这个,我的意思是用户仍然可以看到任务的细节,但他们无法使用表单更改其属性?请记住,用户可能会浏览特定任务的“编辑”表单,当他们正在读取详细信息时,cron作业可能会处理任务并更新任务的“status”属性 - 用户可能会提交表单不知道任务已被处理,表单处理程序可以尝试持久保存实体,可能将“状态”设置为“就绪” - 从而确保在下次cron时再次处理相同的任务工作。
但是,如果任务在其状态设置为“已完成”时变为只读,则表单提交将无效。
答案 0 :(得分:2)
您应该在CRUD中执行此操作。在调用" editAction"您必须检查实体的状态。如果是"已完成"那么你就不会显示编辑表格,而是将用户重定向到" showAction"
例如:
/**
* Displays a form to edit an existing Task entity.
*
* @Route("/{id}/edit", name="task_edit")
* @Method("GET")
* @Template()
*/
public function editAction($id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AcmeTaskBundle:Task')->find($id);
if($entity->isCompleted())
return $this->forward('AcmeTaskBundle:Task:show', array('id' => $id ));
//Else finish edit action
}
/**
* Finds and displays a Task entity.
*
* @Route("/{id}", name="task_show")
* @Method("GET")
* @Template()
*/
public function showAction($id) {
...
}
此外,在检查表单的有效性后,您可以在更新操作中执行相同的操作。以防他们在cron运行之前打开编辑表单。
/**
* Edits an existing Task entity.
*
* @Route("/{id}", name="task_update")
* @Method("PUT")
* @Template("AcmeTaskBundle:Task:edit.html.twig")
*/
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AcmeTaskBundle:Task')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Task entity.');
}
if($entity->isCompleted())
//Redirect Again. Note that this happens BEFORE the flush() which is when the entity is persisted to the db
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$em->flush();
return $this->redirect($this->generateUrl('administration_product_edit', array('id' => $id)));
}
...
}
此外,如果任务完成,您应该删除"编辑选项"从showAction用户界面全部一起。这意味着,在您的twig模板中,您在呈现"编辑按钮"
之前检查实体是否已完成