Ожидаемый аргумент типа "App\Entity\Theme", "Doctrine\Common\Collections\ArrayCollection", указанный в пути свойства "themes"

У меня есть отношения «многие ко многим» между объектами «Клиент», «Формирование» и «Тема». Форма ввода Заказчика не работает.

Я объясняю, что я хочу сделать: я хочу добавить «Клиента», добавив одну или несколько «Формаций» и одну или несколько «Тем», зная, что тема связана с «Формацией», т.е. если у клиента есть Обучение_1, он не сможет иметь Тему из Formation_2.

Весь код есть.

Объект заказчика:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Form\Form;

/**
 * @ORM\Entity(repositoryClass = "App\Repository\FormationRepository")
 * @ORM\Table(name = "lol_customer")
 */
class Customer
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\Column(type = "string", length=180, unique=true)
     */
    private $customerName;

    /**
     * @var Formation[]|ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity = "App\Entity\Formation", cascade = {"persist"})
     * @ORM\JoinTable(name = "lol_customer_formation")
     * @ORM\OrderBy({"id": "ASC"})
     */
    private $formations;

    /**
     * @var Theme[]|ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity = "App\Entity\Theme", cascade = {"persist"})
     * @ORM\JoinTable(name = "lol_customer_theme")
     * @ORM\OrderBy({"id": "ASC"})
     */
    private $themes;

    /**
     * @ORM\Column(type = "boolean")
     */
    private $enabled;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type = "datetime")
     */

    private $startDate;
    /**
     * @var \DateTime
     *
     * @ORM\Column(type = "datetime")
     */
    private $endDate;

    public function __construct()
    {
        $this->startDate = new \DateTime();
        $this->endDate = new \DateTime();
        $this->formations = new ArrayCollection();
    }



    public function getId(): ?int
    {
        return $this->id;
    }

    public function setFormations(Formation ...$formations): void
    {
        foreach ($formations as $formation) {
            if (!$this->formations->contains($formation)) {
                $this->formations->add($formation);
            }
        }
    }

    public function getFormations()
    {
        return $this->formations;
    }

    public function setThemes(Theme ...$themes): void
    {
        foreach ($themes as $theme) {
            if (!$this->themes->contains($theme)) {
                $this->themes->add($theme);
            }
        }
    }

    public function getThemes()
    {
        return $this->themes;
    }

    /**
     * @return CustomerName
     */
    public function getCustomerName()
    {
        return $this->customerName;
    }

    public function setCustomerName($customerName): self
    {
        $this->customerName = $customerName;

        return $this;
    }

    /**
     * @return bool
     */
    public function getEnabled(): bool
    {
        return $this->enabled;
    }

    /**
     * @param bool
     * @return self
     */
    public function setEnabled($enabled): self
    {
        $this->enabled = $enabled;

        return $this;
    }

    public function getStartDate(): \DateTime
    {
        return $this->startDate;
    }

    public function setStartDate(\DateTime $startDate): void
    {
        $this->startDate = $startDate;
    }

    public function getEndDate(): \DateTime
    {
        return $this->endDate;
    }

    public function setEndDate(\DateTime $endDate): void
    {
        $this->endDate = $endDate;
    }

    public function __toString()
    {
        return $this->customerName;
    }

}

Формирование Сущность:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity()
 * @ORM\Table(name = "lol_formation")
 *
 */
class Formation implements \JsonSerializable
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type = "string", unique=true)
     */
    private $name;

    /**
     * @var Theme[]|ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity = "App\Entity\Theme", cascade = {"persist"})
     * @ORM\JoinTable(name = "lol_formation_theme")
     * @ORM\OrderBy({"name": "ASC"})
     */
    private $themes;

    public function __construct()
    {
        $this->themes = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * {@inheritdoc}
     */
    public function jsonSerialize(): string
    {
        return $this->name;
    }

    public function getThemes(): ?array
    {
        return $this->themes;
    }

    public function setThemes(?array $themes): self
    {
        $this->themes = $themes;

        return $this;
    }

    public function __toString(): string
    {
        return $this->name;
    }
}

Сущность темы:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 * @ORM\Table(name = "lol_Theme")
 *
 */
class Theme implements \JsonSerializable
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type = "string", unique=true)
     */
    private $name;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * {@inheritdoc}
     */
    public function jsonSerialize(): string
    {    
        return $this->name;
    }

    public function __toString(): string
    {
        return $this->name;
    }
}

CustomerType (форма Customer):

<?php

namespace App\Form;

use App\Entity\Customer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Form\Type\DateTimePickerType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class CustomerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('customerName', null, array(
                    'label'    => 'Domaine du client ',
                    'required' => true)
            )
            ->add('enabled', null, array(
                'label'    => 'Activer la formation'), [
                'required'   => false,
            ])
            ->add('formations', EntityType::class, [
                'class' => "App\Entity\Formation",
                'choice_label' => 'name',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('themes', EntityType::class, [
                'class' => "App\Entity\Theme",
                'choice_label' => 'name',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('startDate', DateTimePickerType::class, [
                'label' => 'Date de début de la formation',
            ])
            ->add('endDate', DateTimePickerType::class, [
                'label' => 'Date de fin de la formation',
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Customer::class,
            'customerName' => null
        ]);
    }
}

У меня есть следующая ошибка:

Expected argument of type "App\Entity\Theme", "Doctrine\Common\Collections\ArrayCollection" given at property path "themes".

Вы знаете, откуда эта ошибка? Спасибо

Внутри конструктора сущности клиента у вас есть формации: $this->formations = new ArrayCollection(); но не то же самое для тем. Почему?

MilanG 02.07.2019 16:42

@MilanG Вот что я пропустил, это работает! Спасибо большое

SkroS2 02.07.2019 16:45

Прохладный. Сейчас я опубликовал «официальный» ответ, поэтому этот вопрос можно закрыть (пометить как решенный).

MilanG 03.07.2019 08:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
1 395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Внутри конструктора объекта клиента вам не хватает инициализации для коллекции массивов "темы".

Другие вопросы по теме