警告:spl_object_hash()期望参数1为对象,给定数组-Sonata Admin

时间:2018-08-17 23:42:44

标签: forms sonata-admin symfony4

我正在使用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?也许我有事要做以覆盖此结果?

感谢您浏览我的帖子!

0 个答案:

没有答案