Как настроить приборы для ArrayCollection в конструкторе сущностей в NelmioAlice

Я прочитал и попробовал все, что описано в этом разделе документов, но я не могу заставить это работать. Это конструктор на объекте:

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

И я попытался обойти с помощью __construct: false но получите эту ошибку:

[Symfony \ Component \ Yaml \ Exception \ ParseException] Невозможно проанализировать в строке 11 (рядом с " name: ").

Вот как выглядят светильники:

\PDI\PDOneBundle\Entity\Brand:
    # 3 Brand per Company
    brand{1..3}:
       __construct: false
       name: <name()>
       generic_name: <name()>
       logo_url: <imageUrl(128,128)>
       description: <paragraph()>
       isi_required: <boolean(35)>
       isi_text: <realText()>
       isi_pdf_url: <url()>
       pi_required: <boolean(35)>
       pi_text: <realText()>
       pi_pdf_url: <url()>
       inactive: <boolean(35)>
       company: @company*
       createdAt: <dateTimeThisYear()>
       updatedAt: <dateTimeThisYear()>

Если я не поставил __construct тогда ошибка превращается в эту другую:

[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Исправляемая фатальная ошибка: Аргумент 1, переданный в Doctrine\Common\Collections\ArrayCollection::__construct(), должен иметь тип массива, данный объект должен называться в /var/www/html/reptooln_admin/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php в строке 555 и определено

Что случилось? Как я должен настроить прибор?

РЕДАКТИРОВАТЬ:

Я нашел это, но как я могу использовать этот подход на приборе, который я пытаюсь настроить, кто-нибудь может дать мне какой-нибудь совет?

РЕДАКТИРОВАТЬ 1:

Я немного смущен, потому что Brand сопоставлен с TargetBrand сущность и TargetBrand инвертируется Brand сущность, см. сущности ниже:

class Brand
{
    // other class properties

    /**
     * @ORM\OneToMany(targetEntity="TargetBrand" , mappedBy="brand")
     */
    protected $targetBrand;

    protected $targets;

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

    // other class methods

    public function getTargets()
    {
        $targets = new ArrayCollection();
        foreach ($this->targetBrand as $target) {
            $targets[] = $target->getTarget();
        }

        return $targets;
    }

    public function setTargets($targets)
    {
        foreach ($targets as $target) {
            $targetBrand = new TargetBrand();
            $targetBrand->setBrand($this);
            $targetBrand->setTarget($target);
            $this->addTargetBrand($targetBrand);
        }
    }

    public function addTargetBrand($targetBrand)
    {
        $this->targetBrand[] = $targetBrand;
    }

    public function removeTargetBrand($targetBrand)
    {
        return $this->targetBrand->removeElement($targetBrand);
    }
}


class TargetBrand
{
    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     */
    protected $priority;

    /**
     * @var Target
     *
     * @ORM\ManyToOne(targetEntity="Target", inversedBy="targetBrand")
     * @ORM\JoinColumn(name="targets_id", referencedColumnName="id")
     * */
    protected $target;

    /**
     * @var Brand
     *
     * @ORM\ManyToOne(targetEntity="Brand", inversedBy="targetBrand")
     * @ORM\JoinColumn(name="brands_id", referencedColumnName="id")
     * */
    protected $brand;

    public function setPriority($priority)
    {
        $this->priority = $priority;

        return $this;
    }

    public function getPriority()
    {
        return $this->priority;
    }

    public function setTarget(Target $targets = null)
    {
        $this->target = $targets;

        return $this;
    }

    public function getTarget()
    {
        return $this->target;
    }

    public function setBrand(Brand $brand)
    {
        $this->brand = $brand;

        return $this;
    }

    public function getBrand()
    {
        return $this->brand;
    }
}

Если я запускаю светильники, используя набор следующим образом:

Это набор, о котором я упоминал ранее:

$set->addFile(__DIR__.'/Territory.yml', 'yaml');
$set->addFile(__DIR__.'/Representative.yml', 'yaml');
$set->addFile(__DIR__.'/TargetBrand.yml', 'yaml');
$set->addFile(__DIR__.'/Target.yml', 'yaml');
$set->addFile(__DIR__.'/Brand.yml', 'yaml');

$set->addFile(__DIR__.'/Company.yml', 'yaml');
$set->addFile(__DIR__.'/Media.yml', 'yaml');
$set->addFile(__DIR__.'/Message.yml', 'yaml');

$set->addFile(__DIR__.'/Email.yml', 'yaml');

И настройка Brand а также TargetBrand приспособления как следовать:

Я получил эту ошибку вместо:

[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Catchable Fatal Error: Аргумент 1, передаваемый в PDI\PDOneBundle\Entity\TargetBrand::setTarget(), должен быть экземпляром PDI\PDOneBundle\Entity\Target, экземпляром PDI \ PDOneBundle \ Объект Entity \ TargetBrand указан в /var/www/html/reptooln_admin/vendor/nelmio/alice/src/Nelmio/Alice/Loader/Base.php строке 506 и определен

\PDI\PDOneBundle\Entity\Brand:
    # 3 Brand per Company
    brand{1..3}:
       name: <name()>
       generic_name: <name()>
       logo_url: <imageUrl(128,128)>
       description: <paragraph()>
       isi_required: <boolean(35)>
       isi_text: <realText()>
       isi_pdf_url: <url()>
       pi_required: <boolean(35)>
       pi_text: <realText()>
       pi_pdf_url: <url()>
       inactive: <boolean(35)>
       company: @company*
       createdAt: <dateTimeThisYear()>
       updatedAt: <dateTimeThisYear()>
       targetBrand: @targetBrand*

\PDI\PDOneBundle\Entity\TargetBrand:
  # 10000 TargetBrand
  targetBrand{1..1000}:
      priority: <randomDigitNotNull()>
      target: @target*
      brand: @brand*

Каков правильный порядок загрузки светильников в этом случае?

НОТА: $targets больше не нужно, так что не позаботься об этом

2 ответа

Решение

Если у вас определены сеттеры, т.е. setTarget() а также setTargetBrand() или же addTarget() а также addTargetBrand()должно работать следующее:

\PDI\PDOneBundle\Entity\Brand:
    brand{1..3}:
       (define your brands)
\PDI\PDOneBundle\Entity\Target:
    target{1..3}:
       (define your targets)
\PDI\PDOneBundle\Entity\TargetBrand:
    targetBrand{1..3}:
       target: @target<current()>
       brand: @brand<current()>

\PDI\PDOneBundle\Entity\Brand:
    brand{1..3}:
        (..other definitions...)
        targets: [@target1, @target2, @target3]
        targetBrand: [@targetBrand1, @targetBrand2, @targetBrand3]

Для меня добавление связанных (многие ко многим) объектных светильников, работающих таким образом

ordersServices: ['@service_*']
Другие вопросы по тегам