«Ожидаемый аргумент типа« int или null »,« object », заданный в пути свойства - PullRequest
0 голосов
/ 23 марта 2020

Я учусь Symfony недавно. Я столкнулся с ошибкой, я не смог найти серьезного ответа при вызове.

ошибка такова: Uncaught PHP Exception Symfony \ Component \ PropertyAccess \ Exception \ InvalidArgumentException: "Ожидаемый аргумент типа "int или null", "object", указанный в пути к свойству "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',
        ]));
    }
}

Буду признателен, если вы поможете мне. Удобства ...

1 Ответ

0 голосов
/ 23 марта 2020

Проблема в том, что вы неправильно настроили свою сущность или форму. На данный момент, в вашей сущности parent_id определяется следующим образом:

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

в то время как в вашей форме вы ожидаете еще один Category объект:

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

Вам необходимо либо сделайте parent_id в вашей сущности отношение один-ко-многим (где один Category может быть родительской категорией другого), либо сделайте это поле в форме регулярным ChoiceType и введите вручную выбор (путем получения возможных идентификаторов категорий из базы данных). Вы получите эти идентификаторы в действии контроллера и передадите их в $this->createForm в качестве третьего параметра, который называется options.

...