我有一个上传,我想显示数据库中的所有类别,但我不断收到 EntityType 错误,我不知道为什么之前可以正常工作。
这是错误:
Cannot assign Doctrine\ORM\PersistentCollection to property App\Entity\Category::$posts of type Doctrine\Common\Collections\ArrayCollection
<?php
declare(strict_types=1);
namespace App\Entity;
use App\Repository\CategoryRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=CategoryRepository::class)
*/
class Category
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private int $id;
/**
* @ORM\Column(type="string", length=255)
*/
private string $name;
/**
* @ORM\OneToMany(targetEntity=Post::class, mappedBy="Category_id")
*/
private ArrayCollection $Posts;
public function __construct()
{
$this->posts = new ArrayCollection();
}
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;
}
/**
* @return Collection|Post[]
*/
public function gePosts(): Collection
{
return $this->posts;
}
public function addPost(Post $post): self
{
if (!$this->posts->contains($post)) {
$this->$posts[] = $posts;
$post->setCategoryId($this);
}
return $this;
}
public function removePost(Post $post): self
{
if ($this->posts->removeElement($post)) {
// set the owning side to null (unless already changed)
if ($post->getCategoryId() === $this) {
$post->setCategoryId(null);
}
}
return $this;
}
public function __toString(): string
{
return (string) $this->getName();
}
}
我收到错误的上传表单
<?php
declare(strict_types=1);
namespace App\Form\Post;
use App\Entity\Category;
use App\Entity\Post;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\NotBlank;
class UploadType extends AbstractType
{
/**
* @param \Symfony\Component\Form\FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, [
'constraints' => [
new NotBlank([
'message' => 'Please enter a valid Title. '
])
]
])
->add('category', EntityType::class, [
'mapped' => false,
'class' => Category::class,
'choice_label' => 'name',
'expanded' => true
])
->add('poster', FileType::class, [
'required' => false,
'constraints' => [
new File([
'maxSize' => '6000K',
'mimeTypes' => [
'image/x-png',
'image/jpeg',
],
'mimeTypesMessage' => 'Please upload a image file.'
])
]
])
->add('description', TextareaType::class, [
'constraints' => [
new NotBlank([
'message' => 'Please enter a valid Title. '
])
]
])
->add('mediainfo', TextareaType::class, [
'required' => false,
]);
}
/**
* @param \Symfony\Component\OptionsResolver\OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Post::class,
]);
}
}
在 Post 实体中
/**
* @ORM\ManyToOne(targetEntity=Category::class, inversedBy="posts")
*/
private Category $Category_id;
环境信息:
经过一番挖掘,找到了答案,将 ArrayCollection 更改为 Collection 解决了我的问题
改变:
/**
* @ORM\OneToMany(targetEntity=Post::class, mappedBy="Category_id")
*/
private \Doctrine\Common\Collections\ArrayCollection $posts;
至:
/**
* @ORM\OneToMany(targetEntity=Post::class, mappedBy="Category_id")
*/
private \Doctrine\Common\Collections\Collection $posts;
问题在于类型提示(ArrayCollection => Collection)
改变:
/**
* @ORM\OneToMany(targetEntity=Post::class, mappedBy="Category_id")
*/
private ArrayCollection $Posts;
public function __construct()
{
$this->posts = new ArrayCollection();
}
作者:
/**
* @ORM\OneToMany(targetEntity=Post::class, mappedBy="Category_id")
*/
private Collection $Posts;
public function __construct()
{
$this->posts = new ArrayCollection();
}
$this->$posts[] = $posts;
看起来这一行应该是:
$this->$posts[] = $post;
private ArrayCollection $posts;
是对教义的直接依赖:
use Doctrine\Common\Collections\ArrayCollection;
如果你不同意,也许是因为它破坏了 SOLID “D”,请尝试使用纯 php 伪类型 Iterable (https://www.php.net/manual/en/language.types.iterable.php),像这样:
private iterable $posts;
如果这可以帮助其他人,我在我的实体类中遇到了同样的问题。事实证明,由于某些原因,我的文件中缺少
Use
类的 Collection
声明。确保有这两行:
use Doctrine\Common\Collections\Collection;
使用 Doctrine\Common\Collections\ArrayCollection;