我正在使用Symfony 4和Sonata Admin。 我试图在FormBuilder中使用CollectionType在管理控制台中创建订单,但出现此错误:
Warning: spl_object_hash() expects parameter 1 to be object, array given
我知道这是什么意思,但是我找不到解决方法:(
OrderAdmin
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Sonata\AdminBundle\Form\Type\ModelListType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use App\Entity\User;
use App\Entity\OrderProduct;
use App\Form\Type\OrderProductFormType;
class OrderAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper->add('state', ChoiceType::class, array(
'choices' => array(
'PROCESSING' => 'PROCESSING',
'DONE' => 'DONE'
)
));
$formMapper->add('user', EntityType::class, [
'class' => User::class
]);
$formMapper->add('orderProducts', CollectionType::class, array(
'entry_type' => OrderProductFormType::class,
'allow_add' => true,
'allow_delete' => true
));
}
?>
OrderProductFormType
<?php
namespace App\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use App\Entity\Product;
use App\Entity\Size;
use App\Entity\Material;
use App\Entity\Shape;
class OrderProductFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('product', EntityType::class, [
'class' => Product::class
]);
$builder->add('quantity', IntegerType::class);
$builder->add('size',EntityType::class, [
'class' => Size::class,
'required' => false
]);
$builder->add('shape', EntityType::class, [
'class' => Shape::class,
'required' => false
]);
$builder->add('material', EntityType::class, [
'class' => Material::class,
'required' => false
]);
}
public function getBlockPrefix()
{
return 'app_order_product';
}
}
订购
<?php
namespace App\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\OrderProducts;
use App\Entity\Address;
use App\Entity\User;
/**
* @ORM\Entity
* @ORM\Table(name="`order`")
*/
class Order
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $uniqId;
/**
* @ORM\Column(type="string")
*/
protected $state;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="orders")
* @ORM\JoinColumn(nullable=true)
*/
protected $user;
/**
* @ORM\OneToMany(targetEntity="OrderProduct", mappedBy="order", orphanRemoval=true, cascade="persist")
* @ORM\JoinColumn(nullable=true)
*/
protected $orderProducts;
/**
* @ORM\Column(name="created_at", type="datetime")
*/
private $createdAt;
public function __construct()
{
$this->state = 'PROCESSING';
$this->orderProducts = new ArrayCollection();
$this->createdAt = new \Datetime('now');
$this->uniqId = uniqid();
}
OrderProduct
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\User;
use App\Entity\Product;
use App\Entity\Size;
use App\Entity\Shape;
use App\Entity\Material;
use App\Entity\Order;
/**
* @ORM\Entity
* @ORM\Table(name="order_product")
*/
class OrderProduct {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Product", cascade={"persist"})
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
*/
private $product;
/**
* @ORM\ManyToOne(targetEntity="Size")
* @ORM\JoinColumn(nullable=true)
*/
private $size;
/**
* @ORM\ManyToOne(targetEntity="Material")
* @ORM\JoinColumn(nullable=true)
*/
private $material;
/**
* @ORM\ManyToOne(targetEntity="Shape")
* @ORM\JoinColumn(nullable=true)
*/
private $shape;
/**
* @ORM\Column(name="created_at", type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(name="quantity", type="integer")
*/
private $quantity;
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="orderProducts")
* @ORM\JoinColumn(nullable=true)
*/
private $order;
public function __construct() {
$this->createdAt = new \Datetime('now');
}
stackTrace
ErrorException:
Warning: spl_object_hash() expects parameter 1 to be object, array given
at vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1741
at Doctrine\ORM\UnitOfWork->doPersist(array('product' => object(Product)), array('000000001e398cf400000000645d817d' => object(Order)))
(vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2323)
at Doctrine\ORM\UnitOfWork->cascadePersist(object(Order), array('000000001e398cf400000000645d817d' => object(Order)))
(vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1785)
at Doctrine\ORM\UnitOfWork->doPersist(object(Order), array('000000001e398cf400000000645d817d' => object(Order)))
(vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1722)
at Doctrine\ORM\UnitOfWork->persist(object(Order))
(vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:591)
at Doctrine\ORM\EntityManager->persist(object(Order))
(vendor/sonata-project/doctrine-orm-admin-bundle/src/Model/ModelManager.php:173)
at Sonata\DoctrineORMAdminBundle\Model\ModelManager->update(object(Order))
(vendor/sonata-project/admin-bundle/src/Admin/AbstractAdmin.php:663)
at Sonata\AdminBundle\Admin\AbstractAdmin->update(object(Order))
(vendor/sonata-project/admin-bundle/src/Controller/CRUDController.php:355)
at Sonata\AdminBundle\Controller\CRUDController->editAction('14')
(vendor/symfony/http-kernel/HttpKernel.php:149)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:66)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:188)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:37)
我了解他在需要对象时会收到一个数组,但是为什么我得到一个数组而不是带有CollectionType字段的对象OrderProduct?也许我有事要做以覆盖此结果?
感谢您浏览我的帖子!