无法更新实体Symfony2

时间:2015-05-08 06:46:51

标签: symfony doctrine-orm crud

尝试更新我的实体,遗憾的是没有使用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));

        }
    }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

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

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是多余的。

那就是它。希望它有所帮助。

答案 1 :(得分:0)

此处最可能的问题是使用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);

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

$em->flush($entity);

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

问候。