Polska Społeczność Symfony - Forum

Framework => Pomoc => Wątek zaczęty przez: savage.mephisto w Lutego 07, 2020, 01:57:34

Tytuł: Symfony 4.4, FOSUserBundle 2.2.x-dev i problem z encjami User oraz Group
Wiadomość wysłana przez: savage.mephisto w Lutego 07, 2020, 01:57:34
Witam.
Dokonuję migracji z wersji 3.4 frameworka na wersję 4.4 i zaciąłem się na małej popierdółce.
Byłem zmuszony nieco przerobić klasę User i Group w customowym bundlu, którego używam do zarządzania userami, jednak podczas walidacji (php bin/console doctrine:schema:validate) wyskakuje błąd z interfejsami w tle:
Cytuj
Compile Error: Declaration of App\UserBundle\Entity\User::addGroup(App\UserBundle\Entity\Group $group): App\UserBundle\Entity\User must be compatible with FOS\UserBundle\Model\User::addGroup(FOS\UserBundle\Model\GroupInterface $group)

Pierwotnie w encji User miałem zapis:
/**
 * User
 *
 * @ORM\Table(name="fos_user")
 * @ORM\Entity(repositoryClass="App\UserBundle\Repository\UserRepository")
 */
class User extends BaseUser
{
    /**
     * @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\Group")
     * @ORM\JoinTable(name="fos_user_user_group",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    public function __construct()
    {
        parent::__construct();
        $this->groups = new ArrayCollection();
    }

    /**
     * @return Collection|Group[]
     */
    public function getGroups(): Collection
    {
        return $this->groups;
    }

    public function addGroup(Group $group): self
    {
        if (!$this->groups->contains($group)) {
            $this->groups[] = $group;
        }

        return $this;
    }

    public function removeGroup(Group $group): self
    {
        if ($this->groups->contains($group)) {
            $this->groups->removeElement($group);
        }

        return $this;
    }
}

Natomiast w Group widniał zapis:
/**
 * @ORM\Entity
 * @ORM\Table(name="fos_group")
 * @ORM\Entity(repositoryClass="App\UserBundle\Repository\GroupRepository")
 */
class Group extends BaseGroup
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     protected $id;

    public function __construct()
    {
        parent::__construct();
    }

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

Przejrzałem pliki z modelami od wtyczki FOSUserBundle i tam nastąpiła zmiana - pojawiły się interfejsy.

Próbowałem dokonać korekt w encjach w poniższy sposób i przy użyciu polecenia php bin/console make:entity --regenerate utworzyć gettery i settery:

User
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Security\Core\User\UserInterface as BaseUserInterface;
use FOS\UserBundle\Model\UserInterface as UserInterface;
use FOS\UserBundle\Model\GroupInterface as GroupInterface;
use FOS\UserBundle\Model\GroupableInterface as GroupableInterface;

 /**
 * User
 *
 * @ORM\Table(name="fos_user")
 * @ORM\Entity(repositoryClass="App\UserBundle\Repository\UserRepository")
 */
class User extends BaseUser implements UserInterface, GroupableInterface
{
    /**
     * @var GroupInterface[]|Collection
     */
    protected $groups;

    public function __construct()
    {
        parent::__construct();
    }
}

Group
use FOS\UserBundle\Model\Group as BaseGroup;
use FOS\UserBundle\Model\GroupInterface as GroupInterface;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_group")
 * @ORM\Entity(repositoryClass="App\UserBundle\Repository\GroupRepository")
 */
class Group extends BaseGroup implements GroupInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     protected $id;

    public function __construct()
    {
        parent::__construct();
    }
}

Jednak w encji User nie pojawiają się oczekiwane rezultaty - nie ma kolekcji dla groups, ani setterów i getterów.

Niby dopisałem "z palca" fragment:
    /**
     * {@inheritdoc}
     */
    public function getGroups()
    {
        return $this->groups ?: $this->groups = new ArrayCollection();
    }

    /**
     * {@inheritdoc}
     */
    public function getGroupNames()
    {
        $names = [];
        foreach ($this->getGroups() as $group) {
            $names[] = $group->getName();
        }

        return $names;
    }

    /**
     * {@inheritdoc}
     */
    public function hasGroup($name)
    {
        return in_array($name, $this->getGroupNames());
    }

    /**
     * {@inheritdoc}
     */
    public function addGroup(GroupInterface $group)
    {
        if (!$this->getGroups()->contains($group)) {
            $this->getGroups()->add($group);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function removeGroup(GroupInterface $group)
    {
        if ($this->getGroups()->contains($group)) {
            $this->getGroups()->removeElement($group);
        }

        return $this;
    }

ale dlaczego tak się dzieje, że nie pojawia się to automatycznie po przebudowaniu modelu? Zapewne robię jakiś prosty błąd, którego nie widzę na ten moment, bo pora jest już dosyć późna.

Ktoś walczył z FOSUserBundle na SF 4 i wie, jak pozbyć się wspomnianych niedogodności? Będę wdzięczny za poświęcony czas i pomoc.