【问题标题】:Symfony doctrine, update entity without form?Symfony 学说,更新没有形式的实体?
【发布时间】:2014-05-09 18:05:41
【问题描述】:

不确定我是否有这个权利,但我在 twig 模板中创建了自己的自定义表单,操作路径将转到将更新实体的控制器。我只见过使用$form->handleRequest($request) 的表单更新方法,然后使用$em->flush(); 由于我没有通过Symfony 的表单组件制作表单,我不知道如何从模板访问它以便将其刷新到数据库中。

我的动作控制器是这样的:

/**
 * @param $subid
 * @param Request $request
 * @Route("/editparts/{subid}/", name="updateparts")
 * @Template("editparts.html.twig")
 * @Method("POST")
 */
public function updatePartsAction(Request $request, $subid) {
    $r = $this->getDoctrine()->getManager();

    $entity = $r->getRepository('MainBundle:MainSub')->findOneById($subid);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Parts entity to edit.');
    }

    // what is this step???

    $r->flush();

.....

我在twig模板中的表单是这样的:

{% if parts is defined %}
     <div class="inventorysearch">
       <form action="{{ path('updateparts', {'subid' : parts.subid}) }}" method="POST" >
            <input type="text" name="part" value="{{ parts.part }}" disabled><br />
            <input type="text" name="batch" value="{{ parts.batch }}" disabled><br />
            <input type="text" name="rack" required="required" value="{{ parts.rack }}"><br />
           <input type="text" name="acode" value="{{ parts.acode }}"><br />
           <input type="text" name="bcode" value="{{ parts.bcode }}"><br />
           <input type="integer" name="qty" required="required" value="{{ parts.qty }}"><br />
            <button type="submit" name="submit">Update</button>
       </form>
     </div>
    {% endif %}

【问题讨论】:

    标签: php forms symfony doctrine-orm


    【解决方案1】:

    最好和推荐的方法是使用 symfony 的表单构建器

    public function updatePartsAction(Request $request, $subid) {
        $r = $this->getDoctrine()->getManager();
    
        $entity = $r->getRepository('MainBundle:MainSub')->findOneById($subid);
    
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Parts entity to edit.');
        }
        $form= $this->createFormBuilder($entity)
               ->add('part')
               ->add('batch')
               .... and so on the properties from your entity that you want them to edit
               ->getForm();
     if ($this->getRequest()->getMethod() == "POST") {
            $form->handleRequest($request)
            if ($form->isValid()) {
            $r->persist($form->getData());
            $r->flush();
            }
      }
    
    }
    

    在树枝中只渲染你的{{ form(form) }}

    不推荐您要求的其他方式,也不是一个好的做法,但这取决于您将如何以好的方式或坏的方式编写应用程序

    public function updatePartsAction(Request $request, $subid) {
        $r = $this->getDoctrine()->getManager();
    
        $entity = $r->getRepository('MainBundle:MainSub')->findOneById($subid);
    
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Parts entity to edit.');
        }
      if ($this->getRequest()->getMethod() == "POST") {
        $entity->setPath('get values from request')
         and others setters to which you want them to edit        
            $r->persist($entity);
            $r->flush();
    
      }
    }
    

    【讨论】:

    • 如果我们要讨论“最佳和推荐”方式,您应该更进一步,创建一个将实体传递到其中的表单组件。如果您有自定义设计,则还需要创建表单视图。 createFormBuilder 在典型情况下并不理想。如果我想要一个页面来添加新实体、编辑现有实体或复制现有实体但随后能够编辑它的属性,该怎么办? IMO,如果我们谈论的是最好的方式,它应该是最好的方式:p
    • @skrilled 我知道 symfony 中有一个表单类型功能,但如果添加这种类型的代码,我想 OP 消化它会很远,所以我向他展示了一次直接使用表单构建器的实体OP 至少可以使用 symfony 的表单构建器,他将来可以进一步创建表单类型,但我很欣赏你关于 symfony 表单类型的观点
    【解决方案2】:

    这个概念违背了 MVC 的全部目的(试图在模板/视图中这样做),所以我不确定你最后陈述的意思。

    但是,在您的控制器中,您应该通过实体方法访问实体(模型)。

    即如果我有一个带有用户名属性的 $user 实体,我应该有一个 setUsername 方法并且可以这样做:

     $user->setUsername('theusername');
     $em->persist($user); 
     $em->flush();
    

    请注意,我使用 $em 而不是您的 $r 是出于习惯(这是文档显示的内容以及大多数程序员将使用的内容)。

    此外,从长远来看,使用表单组件仍然是一种更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2016-10-08
      相关资源
      最近更新 更多