我们正在使用Symfony 2.3和Doctrine来管理实体。
假设我们有一个名为“任务”的实体,用户可以使用Symfony表单生成器照常创建该实体,并可以使用Doctrine持久保存。例如,“任务”可能是在特定日期发送一些电子邮件的指令。假设“任务”具有一个称为“状态”的属性。正确创建的“任务”的状态可能为“就绪”。
Cron作业会定期调用symfony自定义命令,以检查是否有任何需要处理的“任务”(即状态为“就绪”),如果找到任何“任务”,它将执行某些操作,然后将实体更新为状态“已完成”。
处理完任务并将其状态设置为“已完成”后,是否有任何方法可以使实体有效地变为“只读”状态?通过这个,我的意思是用户仍然可以看到任务的详细信息,但是他们将无法使用表单来更改其属性?请记住,用户可能浏览到特定任务的“编辑”表单,并且在他们阅读详细信息时,cron作业可能会处理任务并更新任务的“状态”属性-然后用户可以提交表单,而又不知道Task已经被处理过,表单处理程序可能会尝试保留该实体,可能将“状态”设置回“就绪”,从而确保下次cron再次处理同一任务工作运行。
但是,如果在任务状态设置为“已完成”时将其设置为只读,则表单提交将无效。
您应该在CRUD中执行此操作。调用“ editAction”后,您必须检查实体上的状态。如果它是“ Completed”,那么您将不会显示编辑表单,而是将用户重定向到“ 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用户界面中删除“编辑选项”。这意味着,在您的树枝模板中,您需要在渲染“编辑按钮”之前检查实体是否已完成
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句