2 votes

Symfony - Héritage optionnel avec Doctrine

Nous rencontrons un problème avec l'héritage sur Symfony 5.

Nous avons créé un UserBundle qui comprend un simple User entité ( id, email, mot de passe ) : le but de ce bundle est de pouvoir le réimporter facilement dans nos différents projets.

Dans certains projets, nous voulons étendre cette entité pour ajouter certains champs spécifiques ( téléphone, adresse, ... ), mais ce n'est pas toujours le cas.

Voici le code que nous avions mis en place :

UserBundle > Classe d'utilisateur :

<?php

namespace MyCompany\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
* @ORM\MappedSuperclass()
*/
class User implements UserInterface
{
   /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    ...

Entité utilisateur héritée :

<?php

namespace App\Entity;

use MyCompany\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* @ORM\Entity
* @UniqueEntity(fields={"email"})
*/
class User extends BaseUser
{
    /**
     * @ORM\Column(type="string", length=50)
     */
    private $phone;

    ...

L'héritage fonctionne bien : le problème vient des projets pour lesquels le User entité de la liasse est suffisante pour nous . => Le User de la liasse est définie comme suit Mapped superclass afin de pouvoir l'étendre mais Doctrine ne peut pas créer une table associée s'il n'y a pas de classe qui en hérite...

Nous pourrions systématiquement créer un User classe dans src/ qui hérite de la User de l'ensemble, mais cela ne me semble pas très propre...

Je suis allé sur ce post mais cela ne semble pas fonctionner : Doctrine de remplacement de l'héritage

Quelqu'un peut-il nous aider à résoudre ce problème ? J'imagine qu'une solution doit exister...

Merci d'avance !

1voto

simon.ro Points 1068

L'idée ci-dessous ne fonctionne pas.

Comme @Cerad l'a déjà souligné, la meilleure approche consiste probablement à définir l'élément concret User dans chaque application. C'est aussi ce que fait FOSUserBundle.


Je choisirais l'approche suivante : Déclarer la superclasse mappée abstraite.

~~/**

  • @ORM\MappedSuperclass() */ abstract class AbstractBaseUser implements UserInterface { /**

    • @ORM\Id()
    • @ORM\GeneratedValue()
    • @ORM\Column(type="integer") */ private $id;

      ...

Et implémenter une classe enfant concrète et vide User à l'intérieur de votre paquet.

/**
* @ORM\Entity
*/
class User extends AbstractBaseUser
{
}~~ 

De cette façon, chaque application peut soit utiliser le User de votre bibliothèque ou en hériter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X