`I've a task: i have two entities - Article(fields: title,text,id and collection of articleMedia) and ArticleMedia(url,id, article_id) so i need to create CRUD for creating an article( with an ability to attach media(img)) But i have a problem and misunderstanding why it doesn't work. So i got error:
Can't get a way to read the property "url" in class "Doctrine\Common\Collections\ArrayCollection".
#[ORM\Entity(repositoryClass: ArticleMediaRepository::class)]
class ArticleMedia
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $url = null;
#[ORM\ManyToOne(inversedBy: 'articleMedia')]
#[ORM\JoinColumn(name: "article_id", referencedColumnName: "id", nullable: false)]
private ?Article $article_id = null;
public function getId(): ?int
{
return $this->id;
}
public function getUrl(): ?string
{
return $this->url;
}
public function setUrl(string $url): static
{
$this->url = $url;
return $this;
}
public function getArticleId(): ?Article
{
return $this->article_id;
}
public function setArticleId(?Article $article_id): static
{
$this->article_id = $article_id;
return $this;
}
}
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\Column(length: 255)]
private ?string $text = null;
#[ORM\OneToMany(mappedBy: 'article', targetEntity: ArticleMedia::class)]
private Collection $articleMedia;
public function __construct()
{
$this->articleMedia = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(string $text): static
{
$this->text = $text;
return $this;
}
/**
* @return Collection<int, ArticleMedia>
*/
public function getArticleMedia(): Collection
{
return $this->articleMedia;
}
public function addArticleMedium(ArticleMedia $articleMedium): static
{
if (!$this->articleMedia->contains($articleMedium)) {
$this->articleMedia->add($articleMedium);
$articleMedium->setArticleId($this);
}
return $this;
}
public function removeArticleMedium(ArticleMedia $articleMedium): static
{
if ($this->articleMedia->removeElement($articleMedium)) {
// set the owning side to null (unless already changed)
if ($articleMedium->getArticleId() === $this) {
$articleMedium->setArticleId(null);
}
}
return $this;
}
}
class ArticleCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Article::class;
}
public function configureFields(string $pageName): iterable
{
return [
TextField::new('title'),
TextEditorField::new('text'),
ImageField::new('articleMedia.url')
->setUploadDir('public/uploads/')
->setFormTypeOptions([
'by_reference' => false,
])
->setRequired(false)
];
}
}