Symfony: проблема с PropertyAccessor

#symfony #properties #accessor

#symfony #свойства #средство доступа

Вопрос:

У меня проблема с PropertyAccessor: существуют две следующие сущности :

 class Foo
{

    /**
     * @ORMManyToOne(targetEntity="AppEntityBar", inversedBy="foo")
     * @ORMJoinColumn(nullable=false)
     */
    private $bar;

    public function getBar(): ?Bar
    {
        return $this->bar;
    }

    public function setBar(?Bar $bar): self
    {
        $this->bar = $bar;
        return $this;
    }
}


class Bar
{
    /**
     * @ORMOneToMany(targetEntity="AppEntityFoo", mappedBy="bar", orphanRemoval=true, cascade="all")
     */
    private $foo

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

    /**
     * @return Collection|Foo[]
     */
    public function getFoo(): Collection
    {
        return $this->foo;
    }

    public function addFoo(Foo $foo): self
    {
        if (!$this->foo->contains($foo)) {
            $this->foo[] = $foo;
            $foo->setBar($this);
        }
        return $this;
    }

    public function removeFoo(Foo $foo): self
    {
        if ($this->foo->contains($foo)) {
            $this->foo->removeElement($foo);
            // set the owning side to null (unless already changed)
            if ($foo->getBar() === $this) {
                $foo->setBar(null);
            }
        }
        return $this;
    }

}
  

У меня много коллекций, таких как Foo, поэтому я использую средство доступа к свойствам для доступа к ним программно. Но когда я делаю :

             $bar = new Bar();
            $foo = new Foo();
            $propertyAccessor->getValue($bar, 'foo')->add($foo);
  

значение $foo->bar остается равным нулю.

Это нормально?

Будет ли тогда удаление orphean по-прежнему работать?

Спасибо за вашу помощь

Ответ №1:

setValue Метод поддерживает добавление в коллекцию. Вы должны вызвать этот метод напрямую для $bar .

 $propertyAccessor->setValue($bar, 'foo', [$foo]);
  

Для получения дополнительной информации см. Документацию

Ответ №2:

Да, это ожидаемо.

$propertyAccessor->getValue($bar, 'foo') вернет экземпляр ArrayCollection . И вызов add($foo) коллекции не будет установлен волшебным $foo->bar образом. Я думаю, вы перепутали это с addFoo() on Bar .

На ваш второй вопрос: вызов $bar->removeFoo($anyFoo) вызовет удаление $anyFoo представления в базе данных.