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

安德鲁·巴蒂(Andrew Battye)

我们正在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将实体设置为默认[symfony2]

来自分类Dev

Symfony2 formbuilder-实体只读字段作为标签

来自分类Dev

Symfony2实体与列的关系

来自分类Dev

空的继承实体Symfony2

来自分类Dev

Symfony2从请求创建实体

来自分类Dev

动态表单(开关实体)symfony2

来自分类Dev

具有CRUD的Symfony2实体

来自分类Dev

Symfony2学说实体未水合

来自分类Dev

Symfony2可重用实体

来自分类Dev

Symfony2:从集合中间删除实体

来自分类Dev

Symfony2:向实体添加方法

来自分类Dev

Symfony2形式,与实体不匹配

来自分类Dev

无法更新实体Symfony2

来自分类Dev

Symfony2关系实体+形式

来自分类Dev

symfony2实体对象与整数崩溃

来自分类Dev

Symfony2 FormType实体字段类型

来自分类Dev

验证Symfony2实体选择字段

来自分类Dev

无法更新实体Symfony2

来自分类Dev

在Symfony2中将实体字段类型显示为每个实体的某些属性的表

来自分类Dev

从Symfony2中的AuthenticationHandler设置flashMessage

来自分类Dev

从Symfony2中的AuthenticationHandler设置flashMessage

来自分类Dev

Nginx + Symfony2 + HHVM的Vhost设置

来自分类Dev

Symfony2 - 设置 ChoiceType 的标签

来自分类Dev

Symfony2向对象添加属性

来自分类Dev

Symfony2,以变量为参数的服务

来自分类Dev

在symfony2中缓存实体方法/属性

来自分类Dev

从数据库加载的Symfony2实体属性

来自分类Dev

Symfony2:动态更改实体字段类型的类属性

来自分类Dev

实体属性类型作为Symfony2中的对象