Symfony主义,更新实体没有形式?

时间:2014-05-09 18:05:41

标签: php forms symfony doctrine-orm

不确定我是否拥有此权限,但我在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 %}

2 个答案:

答案 0 :(得分:2)

最佳和推荐的方法是使用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();

  }
}

答案 1 :(得分:0)

这个概念违背了MVC的整个目的(试图在模板/视图中进行),所以我不确定你上次发表的意思。

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

即。如果我有一个带有username属性的$ user实体,我应该有一个setUsername方法,可以这样做:

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

请注意,我使用$ em代替你的$ r习惯(它是文档显示的内容以及大多数程序员将使用的内容)。

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