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âŻ!
Commentaires et discussions
Ces clients ont profité de notre expertise
LâĂ©quipe de Finarta a fait appel Ă JoliCode pour le dĂ©veloppement de leur plateforme Web. BasĂ©e sur le framework Symfony 2, lâapplication est un rĂ©seau privĂ© de galerie et se veut ĂȘtre une place de communication et de vente dâoeuvres dâart entre ses membres. Pour cela, de nombreuses rĂšgles de droits ont Ă©tĂ© mises en places et une administration poussĂ©eâŠ
Dans le cadre de notre partenariat avec Carb0n, nous avons rĂ©alisĂ© un examen complet de leur infrastructure, allant de lâenvironnement de production, jusquâĂ au code de lâapplication. Nous avons fourni des recommandations stratĂ©giques pour son amĂ©lioration. Notre intervention a notamment couvert : Ăvaluation et renforcement de la sĂ©curitĂ© sur AWS, âŠ
Studapart a fait appel Ă JoliCode pour surmonter plusieurs dĂ©fis techniques que leur Ă©quipe interne ne pouvait gĂ©rer, faute de temps ou dâexpertise. Nous avons travaillĂ© ensemble pour amĂ©liorer leur processus dâonboarding des dĂ©veloppeurs, rĂ©soudre des problĂ©matiques complexes de gestion des droits, et configurer correctement leurs certificats HTTP/HTTPSâŠ