【问题标题】:can't update entity Symfony2无法更新实体 Symfony2
【发布时间】:2015-05-08 06:46:50
【问题描述】:

尝试更新我的实体,不幸的是没有使用 Doctrines 生成 CRUD 功能(必须更改我没有写的东西)。 我终于将数据输入到我的表单中,但它不会保存更改(而且,它不会像人们可能怀疑的那样创建新实体)。 当我单击“保存”时,我总是返回到我的表单以编辑实体的页面。 检查方法是否为 POST,是的。

 if ($form->get('save')->isClicked()) {

好像什么都没做,怎么可能?

这是我的其余操作:

  /**
     * Updates.
     *
     * @Route("/offerweekchange/{offerid}", name="offerweekchange")
     * @Template("")
     */
    public function offerweekchangeAction(Request $request, $offerid)
    {
        $request = $this->get('request');
        if ($offerid) {
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('AlexanderBuerkleShopBundle:Promotion')->findOneBy(array('id' => $offerid));

            $form = $this->createForm(new OfferWeekChangeType(), $entity);
           # \Doctrine\Common\Util\Debug::dump($request->getMethod());
            if ($form->get('save')->isClicked()) {
                if ($request->getMethod() == 'POST') {

                    $form->bind($request);
                    if ($form->isValid()) {
                        $em->flush();
                        return $this->redirect($this->generateUrl('offerweeklist'));
                        }
                    }
                }

            return $this->render('AlexanderBuerkleShopBundle:OfferWeekList:offerweekchange.html.twig',
                array('form' => $form->createView(), 'offerid' => $offerid, 'entity' => $entity));

        }
    }

任何帮助将不胜感激。

【问题讨论】:

    标签: symfony doctrine-orm crud


    【解决方案1】:

    首先,这是您的代码的工作示例:

    public function offerweekchangeAction(Request $request, $offerid)
        {
            if ($offerid) {
                $em = $this->getDoctrine()->getManager();
                $entity = $em->getRepository('AlexanderBuerkleShopBundle:Promotion')->findOneBy(array('id' => $offerid));
    
                $form = $this->createForm(new OfferWeekChangeType(), $entity);
    
                $form->handleRequest($request);
    
               # \Doctrine\Common\Util\Debug::dump($request->getMethod());
                if ($form->isValid()) {
                   $em->persist($entity);
                   $em->flush();
                   return $this->redirect($this->generateUrl('offerweeklist'));
                }
                return $this->render('AlexanderBuerkleShopBundle:OfferWeekList:offerweekchange.html.twig',
                    array('form' => $form->createView(), 'offerid' => $offerid, 'entity' => $entity));
    
            }
        }
    

    其次,你这里有几个错误,我们来一一分析:

    1:

    if ($offerid) {
    

    您的代码在 else 分支上什么也不做。

    2:

    $request = $this->get('request');
    

    您已经将请求参数注入到操作中。此行是多余的。

    3:

    $form->bind($request);
    

    自 2.3 起已弃用。请改用 $form->handleRequest($request)。

    4:

    $em->flush();
    

    您正在刷新实体管理器,但没有任何内容被持久化,因此不会发生任何事情。你必须先用 $em->persist($entity)

    来持久化实体

    5:

    if ($request->getMethod() == 'POST') {
    

    $form->isValid() 方法也会对此进行检查,因此检查 post 是多余的。

    就是这样。希望对您有所帮助。

    【讨论】:

    • 首先,非常感谢!不幸的是,它仍然无法按我的意愿工作。第一个目标:我想在我的表单中显示现有数据。这不再适用于您的代码。第二个目标:对现有数据进行小改动并保存,然后返回我的列表。使用您的代码,Í 可以填写更改,但我必须重新输入所有内容。保存后,我仍然不会被重定向到列表。
    • 没关系。刚刚发现我使用的模板是问题所在。正确渲染表单就可以了。再次感谢您的回答和耐心。
    • 顺便说一句,更新时无需保留实体。 $em->flush();似乎已经足够了。
    • @pcm Burnt 是正确的,更新的时候不需要持久化,只需要创建的时候。
    【解决方案2】:

    这里最可能的问题是定义表单的 AbstractType OfferWeekChangeType)。

    为了将表单数据映射到实体上,您需要设置“data_class”。

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => ' Acme\StoreBundle\Entity\Product',
            )
        );
    }
    

    然后在你的控制器内部你需要调用:

    $form->handleRequest($request);
    

    这会将请求绑定到您的表单。

    仅当您调用时:

    $form->isValid()
    

    表单中的数据(如果有效)将映射到实体上。

    $em->persist($entity);
    

    在这种情况下是多余的,因为 Doctrine UnityOfWork 在您从存储库中获取实体时已经“知道”实体。只需调用

    $em->flush($entity);
    

    请记住,最好只刷新所需的实体(如果可能)刷新整个 UnityOfWork 以避免意外行为。

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多