Symfony2 - 设置一个实体,使其属性为“只读”

时间:2014-06-12 12:26:23

标签: symfony cron doctrine

我们正在使用Symfony 2.3和Doctrine来管理实体。

假设我们有一个名为“Task”的实体,用户可以像往常一样使用Symfony表单构建器创建,并且可以使用Doctrine持久化。例如,“任务”可能是在某个特定日期发送一些电子邮件的指令。假设“任务”具有称为“状态”的属性。已正确创建的“任务”可能具有“就绪”状态。

cron作业定期调用symfony Custom Command来检查是否有任何需要处理的“任务”(即状态为“Ready”),如果发现任何“任务”,它会执行一些操作,然后将实体更新为状态为“已完成”。

一旦任务被处理并且其状态被设置为“已完成”,有没有办法使实体有效地“只读”?通过这个,我的意思是用户仍然可以看到任务的细节,但他们无法使用表单更改其属性?请记住,用户可能会浏览特定任务的“编辑”表单,当他们正在读取详细信息时,cron作业可能会处理任务并更新任务的“status”属性 - 用户可能会提交表单不知道任务已被处理,表单处理程序可以尝试持久保存实体,可能将“状态”设置为“就绪” - 从而确保在下次cron时再次处理相同的任务工作。

但是,如果任务在其状态设置为“已完成”时变为只读,则表单提交将无效。

1 个答案:

答案 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模板中,您在呈现"编辑按钮"

之前检查实体是否已完成