无法更新实体 Symfony2

can't update entity Symfony2

尝试更新我的实体,不幸的是没有使用 Doctrines 生成 CRUD 功能(必须更改我没有写的东西)。 我终于将数据输入到我的表单中,但它不会保存更改(而且,它不会像人们怀疑的那样创建一个新实体)。 当我单击 'save' 时,我总是 return 到我有我的表单编辑实体的页面。 检查方法是否为 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));

        }
    }

如有任何帮助,我们将不胜感激。

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

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

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

这里最有可能的问题是定义表单的 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 已经 'knows' 从存储库 获得它时的实体。只需调用

$em->flush($entity);

作为旁注,请记住,最好(在可能的情况下)仅刷新所需的实体,刷新整个 UnityOfWork 以避免意外行为。

此致。