Accéder au contenu principal

3min.

L’opĂ©rateur de merge en YAML, le pire ennemi de la duplication de configuration

Section intitulĂ©e dans-l-episode-precedentđŸ“ș Dans l’épisode prĂ©cĂ©dent


Fin 2017 Ă  l’occasion du Calendrier de l’avent de l’AFSY, Baptiste avait Ă©crit un article plein de bons conseils pour configurer efficacement EasyAdminBundle. Depuis, nous avons Ă©tĂ© confrontĂ© Ă  de nouveaux cas qui nous ont forcĂ© Ă  repousser les limites de notre imagination et Ă  exploiter tout le potentiel du YAML dans la configuration d’EasyAdminBundle ! PrĂȘt ? C’est parti !

Prenons l’entitĂ© Beer (dĂ©jĂ  utilisĂ©e dans l’article de Baptiste), dont les propriĂ©tĂ©s sont les suivantes :

Beer
    - id: integer (mandatory)
    - name: string (mandatory)
    - description: string (mandatory)
    - abv: integer (mandatory)
    - ibu: integer (mandatory)
    - labelThumbnail: string (mandatory)
    - isOrganic: bool (mandatory, default = false)
    - category: Category (mandatory)
    - status: smallint (mandatory)
    # On ajoute aujourd'hui ces 2 propriétés
    # l'une pour les biĂšres "d'usine", l'autre pour les biĂšres "d'abbaye"
    - factory: Factory (optional)
    - abbey: Abbey (optional)

Nous voulons maintenant afficher 2 listes de biĂšres dans EasyAdmin : les biĂšres bio (isOrganic = true) qui viennent d’une abbaye et les autres qui viennent d’une usine (pour faire simple). L’idĂ©al serait donc de ne pas avoir Ă  rĂ©pĂ©ter 2 fois toutes nos propriĂ©tĂ©s dans la configuration d’EasyAdmin comme on le ferait naturellement :

easy_admin:
    entities:
        Beer:
            class: App\Entity\Beer
            list:
                dql_filter: "entity.isOrganic = false"
                fields:
                    - { property: 'name' }
                    - { property: 'description' }
                    - { property: 'labelThumbnail' }
                    - { property: 'factory' }
        OrganicBeer:
            class: App\Entity\Beer
            list:
                dql_filter: "entity.isOrganic = true"
                fields:
                    - { property: 'name' }
                    - { property: 'description' }
                    - { property: 'labelThumbnail' }
                    - { property: 'abbey' }

Chaque liste de propriĂ©tĂ©s fields est ici une sĂ©quence YAML (Ă©quivalent d’un tableau sans clĂ©). L’idĂ©e serait de pouvoir rĂ©utiliser notre premiĂšre liste de propriĂ©tĂ©s, et mĂȘme de pouvoir la surcharger.

Nous allons donc utiliser le systĂšme de rĂ©fĂ©rences fourni par YAML, ainsi que l’opĂ©rateur de merge <<.

Voici comment dĂ©clarer une rĂ©fĂ©rence rĂ©utilisable :

easy_admin:
    entities:
        Beer:
            class: App\Entity\Beer
            list:
                dql_filter: "entity.isOrganic = false"
                fields: &beerListFields
                    - { property: 'name' }
                    - { property: 'description' }
                    - { property: 'labelThumbnail' }
                    - { property: 'factory' }

La référence est déclarée avec le symbole & et elle porte le nom beerListFields.

Le problĂšme que nous allons rencontrer ici, c’est que les rĂ©fĂ©rences YAML ne supportent pas les sĂ©quences. L’astuce consiste Ă  transformer la sĂ©quence des propriĂ©tĂ©s en mapping avec des clĂ©s (numĂ©riques par dĂ©faut).

Section intitulĂ©e here-s-the-magic✹ Here’s the magic

easy_admin:
    entities:
        Beer:
            class: App\Entity\Beer
            list:
                dql_filter: "entity.isOrganic = false"
                fields: &beerListFields
                    1: { property: 'name' }
                    2: { property: 'description' }
                    3: { property: 'labelThumbnail' }
                    4: { property: 'factory' }
        OrganicBeer:
            class: App\Entity\Beer
            list:
                dql_filter: "entity.isOrganic = true"
                fields:
                    <<: *beerListFields
                    4: { property: 'abbey' }

Ici nous dĂ©clarons une rĂ©fĂ©rence avec &beerListFields, Ă  laquelle nous faisons appel avec *beerListFields. Nous utilisons l’opĂ©rateur de merge YAML << pour rĂ©cupĂ©rer notre liste de champs. Nous en profitons pour surcharger le 4eme champ avec la propriĂ©tĂ© abbey.

Le tout reste du YAML valide, parfaitement compris par le composant YAML de Symfony 🎉

Section intitulĂ©e one-more-thing🎁 One more thing

Cet opĂ©rateur de merge YAML << est utilisable dans n’importe quel fichier YAML. Vous pouvez donc vous en servir pour vos configurations ; HTTPlug, mapping Elasticsearch, Doctrine, etc. C’est en tout cas un bon moyen de rĂ©duire la rĂ©pĂ©tition de code dans vos fichiers YAML lorsque ceux ci deviennent trop volumineux !

Auteurs & autrices

Commentaires et discussions

Ces clients ont profité de notre expertise