"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
。
我最近在学习 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
。