"Expected argument of type "int 或 null","object" 在 属性 路径中给出

"Expected argument of type "int or null", "object" given at property path

我最近在学习 Symfony。打电话遇到错误找不到正经的回答

错误是这样的: 未捕获 PHP 异常 Symfony\Component\PropertyAccess\Exception\InvalidArgumentException: "Expected argument of type" int or null "," object "given at property path" parent_id "."在 /home/vagrant/code/vendor/symfony/property-access/PropertyAccessor.php 行 198

我的控制器文件中有这些代码:

public function new(Request $request): Response
{
    $category = new Category();
    $form = $this->createForm(CategoryType::class, $category);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($category);
        $entityManager->flush();

        return $this->redirectToRoute('category_index');
    }

    return $this->render('category/new.html.twig', [
        'category' => $category,
        'form' => $form->createView(),
    ]);
}

我的 FormType 文件如下所示:

<?php

namespace App\Form;

use App\Entity\Category;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', null, [
                'attr' => ['class' => 'form-control'],
            ])
            ->add('slug', null, [
                'attr' => ['class' => 'form-control'],
            ])
            ->add('parent_id', EntityType::class, [
                'class' => Category::class,
                'choice_label' => 'name',
                'attr' => ['class' => 'form-control'],
                'placeholder' => 'Üst Kategori Seçiniz',

            ])
            ->add('title', null, [
                'attr' => ['class' => 'form-control']
            ])
            ->add('description', null, [
                'attr' => ['class' => 'form-control']
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Category::class,
            'required' => false

        ]);
    }
}

我的实体文件内容如下

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $slug;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $parent_id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $description;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(?string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSlug(): ?string
    {
        return $this->slug;
    }

    public function setSlug(?string $slug): self
    {
        $this->slug = $slug;

        return $this;
    }

    public function getParentId(): ?int
    {
        return $this->parent_id;
    }

    public function setParentId(?int $parent_id): self
    {
        $this->parent_id = $parent_id;
        return $this;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function __toString()
    {
        return $this->name;
    }

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new Assert\NotBlank());
        $metadata->addPropertyConstraint('title', new Assert\NotBlank());
        $metadata->addPropertyConstraint('description', new Assert\NotBlank());
        $metadata->addPropertyConstraint('slug', new Assert\NotBlank());
        $metadata->addConstraint(new UniqueEntity([
            'fields' => 'slug',
        ]));
    }
}

如果你能帮助我,我将不胜感激。便利 ...

问题是您没有正确配置实体或表单。目前,在您的实体中 parent_id 定义如下:

/**
 * @ORM\Column(type="integer", nullable=true)
 */
private $parent_id;

在您的表单中,您希望那里有另一个 Category 对象:

->add('parent_id', EntityType::class, [
    'class' => Category::class,

您需要将实体中的 parent_id 设为 one-to-many relationship (where one Category can be the parent category of another) or make that field in the form a regular ChoiceType and manually supply choices (by getting possible category ids from database). You would get those ids in the controller action and supply them to $this->createForm as a third parameter called options