i have a upload from where i would like to show all the catégories from the database but i keep getting an error with the EntityType i don’t know why was working before.
This is the error: Cannot assign DoctrineORMPersistentCollection to property AppEntityCategory::$posts of type DoctrineCommonCollectionsArrayCollection
<?php
declare(strict_types=1);
namespace AppEntity;
use AppRepositoryCategoryRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=CategoryRepository::class)
*/
class Category
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private int $id;
/**
* @ORMColumn(type="string", length=255)
*/
private string $name;
/**
* @ORMOneToMany(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();
}
}
The upload Form where i am getting the error
<?php
declare(strict_types=1);
namespace AppFormPost;
use AppEntityCategory;
use AppEntityPost;
use SymfonyBridgeDoctrineFormTypeEntityType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeFileType;
use SymfonyComponentFormExtensionCoreTypeTextareaType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsFile;
use SymfonyComponentValidatorConstraintsNotBlank;
class UploadType extends AbstractType
{
/**
* @param SymfonyComponentFormFormBuilderInterface $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 SymfonyComponentOptionsResolverOptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Post::class,
]);
}
}
in the Post entity
/**
* @ORMManyToOne(targetEntity=Category::class, inversedBy="posts")
*/
private Category $Category_id;
Environment info:
- Symfony 5.2.5 (env: dev, debug: true)
- PHP Version: 8.0.3
- Database Driver & Version: 8.0.23-0ubuntu0.20.04.1
4
Answers
After some digging a found the answer changing the ArrayCollection to Collection fixed my issue
change:
to:
$this->$posts[] = $posts;
Looks like this line should be:
$this->$posts[] = $post;
The problem is in th type hinting (ArrayCollection => Collection)
change:
by:
is a direct dependence to Doctrine :
If you desagree, perhaps because it breaks the SOLID "D", try to use the pure php pseudo type Iterable (https://www.php.net/manual/en/language.types.iterable.php), like this: