Symfony:使用保存在会话中的实体来混合表单(原则代理)
Symfony: hydrate a form with entities saved in session (doctrine proxies)
我正在使用 symfony2 和 doctrine2。
我有一个执行大量计算的函数。第一个屏幕显示结果,第二个屏幕显示用于修改结果的表单。
为了不重新计算和重新查询数据库,我将第一个结果保存在会话变量中以将它们传递到下一个屏幕,然后在那里检索它们。
现在,我想使用从会话中检索到的元素来组合表单,但出现以下错误:
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
据我所知,这是触发的原因是从会话中检索到的实体不是实际实体而是代理(对象(Proxies__CG__\AppBundle\Entity\MarketPlace\Product)[512])
我不能从会话中保存的数据中提取表单吗?我该如何解决我的问题?
我有以下控制器代码:
/**
* @Route("/planning_order", name="planning_order")
* @Method({"GET", "POST"})
* @Template(":MarketPlace/Order:planning_order.html.twig")
* @param Request $request
* @return array
*/
public function planningOrderAction(Request $request)
{
$formManager = $this->get('form_manager');
$orderManager = $this->get('order_manager');
$order = new Order();
$products = $this->get('session')->get('products');
if (!$products)
{
$formManager->addError("Aucun planning de production n'a été trouvé. Veuillez en sélectionner pour générer des commandes.");
return $this->redirect($this->generateUrl('display_plannings', array('includeAssociates' => true)));
}
$placePlanningOrderForm = $orderManager->getPlacePlanningOrderForm($products, $order);
return array('place_planning_order_form' => $placePlanningOrderForm->createView());
}
我的表单是这样生成的:
/**
* @param array $products
* @param Order $order
* @return \Symfony\Component\Form\Form|\Symfony\Component\Form\FormInterface
*/
public function getPlacePlanningOrderForm(Array $products, Order $order)
{
foreach ($products as $productData)
{
/** @var $product Product */
$product = $productData['product'];
$orderDetail = new OrderDetail();
$orderDetail->setProduct($product);
$order->addOrderDetail($orderDetail);
}
$placePlanningOrderForm = $this->formManager->createForm(
new PlacePlanningOrderType(),
$order,
'POST',
'planning_order'
);
return $placePlanningOrderForm;
}
我的表格如下:
$builder
->add('product', 'genemu_jqueryselect2_entity', array(
'label' => 'Produit',
'class' => 'AppBundle:MarketPlace\Product'
))
->add('quantity', 'text', array('label' => 'Quantité à commander'))
;
这意味着 UnitOfWork
对您从会话中获得的实体一无所知。要使实体处于 MANAGED
状态,您应该坚持、刷新或找到它(因此 Doctrine 将开始监视该实体)。因此,我建议您在会话中保存的不是对象,而是 ID,然后只需找到所有具有 id IN(array of IDs from session)
.
的产品
我正在使用 symfony2 和 doctrine2。 我有一个执行大量计算的函数。第一个屏幕显示结果,第二个屏幕显示用于修改结果的表单。 为了不重新计算和重新查询数据库,我将第一个结果保存在会话变量中以将它们传递到下一个屏幕,然后在那里检索它们。 现在,我想使用从会话中检索到的元素来组合表单,但出现以下错误:
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
据我所知,这是触发的原因是从会话中检索到的实体不是实际实体而是代理(对象(Proxies__CG__\AppBundle\Entity\MarketPlace\Product)[512])
我不能从会话中保存的数据中提取表单吗?我该如何解决我的问题?
我有以下控制器代码:
/**
* @Route("/planning_order", name="planning_order")
* @Method({"GET", "POST"})
* @Template(":MarketPlace/Order:planning_order.html.twig")
* @param Request $request
* @return array
*/
public function planningOrderAction(Request $request)
{
$formManager = $this->get('form_manager');
$orderManager = $this->get('order_manager');
$order = new Order();
$products = $this->get('session')->get('products');
if (!$products)
{
$formManager->addError("Aucun planning de production n'a été trouvé. Veuillez en sélectionner pour générer des commandes.");
return $this->redirect($this->generateUrl('display_plannings', array('includeAssociates' => true)));
}
$placePlanningOrderForm = $orderManager->getPlacePlanningOrderForm($products, $order);
return array('place_planning_order_form' => $placePlanningOrderForm->createView());
}
我的表单是这样生成的:
/**
* @param array $products
* @param Order $order
* @return \Symfony\Component\Form\Form|\Symfony\Component\Form\FormInterface
*/
public function getPlacePlanningOrderForm(Array $products, Order $order)
{
foreach ($products as $productData)
{
/** @var $product Product */
$product = $productData['product'];
$orderDetail = new OrderDetail();
$orderDetail->setProduct($product);
$order->addOrderDetail($orderDetail);
}
$placePlanningOrderForm = $this->formManager->createForm(
new PlacePlanningOrderType(),
$order,
'POST',
'planning_order'
);
return $placePlanningOrderForm;
}
我的表格如下:
$builder
->add('product', 'genemu_jqueryselect2_entity', array(
'label' => 'Produit',
'class' => 'AppBundle:MarketPlace\Product'
))
->add('quantity', 'text', array('label' => 'Quantité à commander'))
;
这意味着 UnitOfWork
对您从会话中获得的实体一无所知。要使实体处于 MANAGED
状态,您应该坚持、刷新或找到它(因此 Doctrine 将开始监视该实体)。因此,我建议您在会话中保存的不是对象,而是 ID,然后只需找到所有具有 id IN(array of IDs from session)
.