Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Profil pro
    None
    Inscrit en
    mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : mars 2008
    Messages : 57
    Points : 69
    Points
    69

    Par défaut API Platform: associer plusieurs resources à une même entité

    Bonjour.

    Il s'agirait de créer 2 resources distinctes, App\Resource\Category et App\Resource\Classification, qui font référence à une seule et même entité App\Entity\Classification. On a 2 endpoints différents v1/classifications et v2/categories et l'idéal serait que mes 2 ressources étendent mon entity.

    Pseudo code exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    // src/Entity/Classification.php
    namespace App\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\ClassificationRepository")
     */
    class Classification
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $code;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $label;
     
        public function getId()
        {
            return $this->id;
        }
     
        // ... getter and setter methods
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    // src/Resource/Classification.php
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use App\Entity\Classification as ClassificationEntity;
     
    /**
     * ...
     * @ApiResource(
     *     collectionOperations={"get"},
     *     itemOperations={"get"}
     * )
     */
    class Classification extends ClassificationEntity
    {
        // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    // src/Resource/Category.php
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use App\Entity\Classification as ClassificationEntity;
     
    /**
     * ...
     * @ApiResource(
     *     collectionOperations={"get"},
     *     itemOperations={"get"}
     * )
     */
    class Category extends ClassificationEntity
    {
        // ...
    }
    et chaque ressource aurait son endpoint, son serializer, son normaliser, etc, etc, ... Bref, serait customisée à sa sauce.

    Sauf qu’apparemment, les annotations et l'héritage ne font pas bon ménage, et les infos de l'entity associée à la ressource se perdent en route. Du coup, j'ai des messages d'erreur en pagaille et rien ne fonctionne.

    Évidemment, si j'associe des DataProvider à chacune de mes ressources et que je les branche sur les bons repository, ça marche. Mais du coup, je perds toutes les fonctionnalités natives de la couche Doctrine d'ApiPlatform et je dois tout réimplémenter (un exemple parmi tant d'autres: les @ApiFilter)

    Y a-t-il un moyen plus simple d'associer plusieurs ressources à une même entité?

    Voila maintenant de nombreuses heures que je m'y casse les dents, et je n'avance pas.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    Par défaut

    Si je comprend la demande, tu veux deux Entity qui gère la même table ?
    Je ne pense pas qu'il faille alors étendre, mais simplement signifier à ton Entity ce quelle gère .

    Comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    namespace App\Entity;
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use Doctrine\ORM\Mapping as ORM;
    /**
     * classification
     * @ApiResource()
     * @ORM\Table(name="classification")
     * @ORM\Entity
     */
    class Classification
    {
        // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    namespace App\Entity;
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use Doctrine\ORM\Mapping as ORM;
    /**
     * classification
     * @ApiResource()
     * @ORM\Table(name="classification")
     * @ORM\Entity
     */
    class Category
    {
        // ...
    }

  3. #3
    Membre du Club
    Profil pro
    None
    Inscrit en
    mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : mars 2008
    Messages : 57
    Points : 69
    Points
    69

    Par défaut

    Bonjour.

    Merci beaucoup pour votre réponse.

    Le besoin correspond à plusieurs ressources branchées sur une même entité. Créer autant d'entités (avec les repositories associés) que de ressources, et toutes les brancher sur la même table, j'avoue que ça ne m'était pas venu à l'esprit.

    Effectivement, ça résoudrait ce problème. Mais ne risque-t-il pas d'y avoir des effets de bords bizarres. J'avoue n'avoir jamais tenté ce cas de figure, et n'avoir aucune idée des impacts.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    Par défaut

    Citation Envoyé par danidan75 Voir le message
    Bonjour.
    J'avoue n'avoir jamais tenté ce cas de figure, et n'avoir aucune idée des impacts.
    Moi non plus

    Le plus simple n'est-il pas de définir des routes spécifique à ton besoin et ne travailler que sur une seule entité ?

    Subressource ne serait pas ta solution ?

    https://api-platform.com/docs/core/o.../#subresources

  5. #5
    Membre du Club
    Profil pro
    None
    Inscrit en
    mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : mars 2008
    Messages : 57
    Points : 69
    Points
    69

    Par défaut

    J'ai beau lire et relire la doc, tous les exemples fournis vont dans le même sens: une sous-ressource est liée à une ressource.
    Or, dans le cas qui me préoccupe, les 2 ressources n'ont aucun lien entre elles, si ce n'est qu'elles font référence à une même entité. Autrement dit, classification n'est pas une propriété de category, et category n'est pas non plus une propriété de classification.

    Par contre, je viens de me demander, est-il possible de déclarer plusieurs @ApiResource dans une même entité? Ça vaut le coup de tester

    Et la réponse est: NON! Malheureusement. Ça aurait résolu toutes les problématiques d'un coup, d'un seul

  6. #6
    Membre du Club
    Profil pro
    None
    Inscrit en
    mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : mars 2008
    Messages : 57
    Points : 69
    Points
    69

    Par défaut

    A noter que dupliquer les entités pose un nouveau problème (et pas des moindres): quid des relations?

    En PJ mon répertoire Entity. Si je créé une seconde entité Category.php copier/coller de Classification.php, toutes 2 pointant sur la même table, alors je mets les 2 attributs dans ClassificationAttributes.php, et j'ai donc 2 propriétés différentes qui représentent la même chose?
    Fichiers attachés Fichiers attachés

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA & Dev PHP
    Inscrit en
    juin 2005
    Messages
    4 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA & Dev PHP
    Secteur : Service public

    Informations forums :
    Inscription : juin 2005
    Messages : 4 980
    Points : 11 116
    Points
    11 116

    Par défaut

    Tu as posé la question sur le chan Slack....car je pense que nous sommes pas beaucoup ici à utiliser ApiPlatforme, voire nous sommes tous débutant

Discussions similaires

  1. [2.x] [Form] Plusieurs formulaires sur une même entité
    Par flutz dans le forum Symfony
    Réponses: 1
    Dernier message: 15/09/2012, 23h24
  2. Réponses: 7
    Dernier message: 22/09/2011, 09h03
  3. Associer plusieurs noms à une même entrée.
    Par bilibou dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2008, 14h24
  4. Réponses: 2
    Dernier message: 21/02/2008, 20h05
  5. Réponses: 3
    Dernier message: 15/05/2006, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo