无法更新实体 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 以避免意外行为。
此致。
尝试更新我的实体,不幸的是没有使用 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 以避免意外行为。
此致。