Skip to content

2018-03-30: SF Live 2018

Joind.in keynotes

Liste et résumé des talks

Symfony 4

  • Flex vs old model d'installation
  • Opinionated stance from SF Core Team : packs (groups of components), recipes, aliases
  • Pas d'info sur les private recipes ?

Archi modulaire

  • wikimedia/composer-merge-plugin: gestion monorepo ?
  • yarn workspaces: une seule config yarn pour un monorepo

Jolicode : traduction

  • i18n: traduction
  • i10n: localization

  • traduction = UI + URLs + Contenus

  • format de fichier:

    • .po / .mo (poedit..) : ex Drupal / WP ...
    • .xlf (xliff)
  • php-translation: remplace lexik/translation et jmstranslationbundle.

  • chez nous: UI de translation centralisée / microservice - php-translation + storage adapter custom ?
  • No Cron plz : static trad au déploiement...

Allociné: Migration SF 3.4 en SF 4

  • brique SSO chez allociné = en SF 3 (dans le cadre d'une migration progressive .NET vers SF)
  • checklist d'étapes de migration à suivre (ou pas)

Sensiolabs: Outils de dev pour Symfony

  • blabla makefile c'est mieux qu'un readme.md. Sureeee....
  • composition de multiples docker-compose.yml: good !

Openclassrooms: Clean architecture

  • différentes approches pour découpler le code vue / metier / application / infrastructure
  • evaluation d'un bon modèle = permet de faire évoluer le code et les différentes règles liées
  • dans l'ordre de rigidité: MVC / Business Layer / Domain Driven Design (domain layer + infrastructure layer)
  • dans une conception DDD : une implementation Doctrine sera dans l'infrastructure layer par exemple
  • clean architecture: évolution du principe DDD + respect de la partie SOLID - interfaces entre toutes les couches du modèle (ex: entity gateway / request-response model). le domaine est donc entièrement isolé (classe UseCase en pattern Command, classe GatewayEntity qui est implémenté derrière en Entity Doctrine, le controller crée des requetes de UseCase-execute()...)
  • utilisé depuis 4 ans chez openclassrooms
  • attention: coût d'entrée pour la "clean architecture": boilerplate a mort. Mais avantage: self-documenting architecture (intention = use case classes)
  • devops mais entre dev et metier : hmmm le metier va lire ces fableulses classes UseCase ?

Mutation testing

  • effectuer de la QA sur les tests eux-même
  • code coverage: permet de savoir quelles lignes n'ont pas été testées
  • MAIS parfois un bug peut etre intorduit dans le code et ne fait pas fail les tests
  • introduire des bugs dans le source afin de voir si les tests tiennent toujours = mutation testing
  • killed/generated = mutation score. Le but étant de "tuer" tous les mutants avec notre suite de tests
  • il y a donc 2 metriques de QA sur les tests eux meme
  • lib php: infection/infection.
  • conseil : utiliser uniquement sur les diffs PR, runner only sur le code déjà couvert
  • interet: qualité du test, code mort ds les test & aide au refacto
  • limites: very slow (bruteforce!) nTests x nMutants.. / sideeffects avec tests d'integration / comment selectionner les mutants intéressants et les garder de tests en tests ? / comment virer les mutants harmless ?

ManoMano: Doctrine + DDD

  • DDD = les règles métier (domaine) doivent etre exprimées clairmeent = dans l'entité ???
  • Value Object = 1 classe par champ de l'entité qui contient les regles métier associées + instancier l'entité avec tous les valueObject.
  • dans doctrine:
    • methode 1: définir un customType = valueObject
    • methode 2: embeddable. annotation qui permet d'injecter le valueobject. Le valueObject etant défini en tant qu'objet Embeddable

Nicolas Grekas: moteur php 7 + optimisations

  • codebase php: 870Kloc en C
  • julien pauli + nikic
  • modèle d'exécution: master process -> child process management (réutilisation de child process, parallélisation des process, synchrone car chaque process gère un seul script)
  • memory manager = isolation entre chaque script (la mémoire est wipée a la fin de chaque script)
  • stratégies : autoloader, cache code
  • où cacher: shared memory (OS), process memory (temporaire le temps que le process est vivant)
  • ce qui est caché: realpath cache, regex compilées, opcache
  • what is opcache: opcode est le resultat de la compilation d'un script php. En php7, ajout d'un AST, étape intermediaire (syntax tree) entre le parsing du script et sa compilation en opcode
  • nouvelles optimisations a la compilation only en php 7 :
    • par exemple, concaténation de chaines, elimination de dead code qui ne sera jamais exécuté. Toutes ces otpimisations sont placées dans la mémoire partagée lors de la compil
    • du coup, certaines instructions sont inline au compile time - au lieu de faire l'appel d'une fonction externe, appel à un opcode deja généré: \is_array(), \count()... etc. Il existe une shortlist de fonctions inlinables, ne pas faire ca pour tout lol
  • note: les scripts CLI n'utilisent pas la mémoire partagée puisque pas handlé par le master process PHP.. Pas de mémoire partagée, pas d'opcache. Le startup time observé correspond au parsing/compilation du script. Optim possible: générer l'opcache d'un script CLI dans un fichier.
  • require is really fast: avec opcache, ce n'est pas un accès file, mais un accès à un opcode "interned string" donc rapide
  • la memoire partagée est read only donc mecanisme de copy on write dans la memoire locale du process lors d'une modification d'un element. IE: un tableau en shared memory (ex: resultat d'un autoloader) sort de la memoire partagée s'il est modifié. La stratégie d'optimisation consite donc à ne pas trigger ce mecanisme.
  • garbage collector: 10k objects crées = triggered . PHP 7.3 reglera definitivement ce pb ?
  • coalesce operator A ?? B est plus efficace que isset(A)? B : B
  • phpbenchmarks, blackfire = measure !

Samuel Roze - Symfony Messenger

  • Projet devops à coté: ContinuousPipe
  • une des plus grosses PR sur Symfony
  • mergé en composant experimental en SF 4.1
  • intégration au Profiler de symfony
  • architecture interne : messsage + message handler (regles metier) + message bus + adapter (implémentation d'un message bus, exemple AMQPAdapter)

HighCo Data - HTTPlug bundle

  • Implementation PSR7 request/response. S'utilise via adapter sur Curl, guzzle.. (=client), à décider à l'installation
  • en Flex : composer require http installe httplug + curl
  • plugins: profiler par exemple
  • bonnes pratiques: mocker les appels aux services externes....
  • client spécfique simple: mock-client = crée une httplug.factory.mock. permet de créer des mock request et mock response (ou exception), + un service public pour utiliser ds les tests. L'ordre d'appel = l'ordre de création des requests/responses dans le client.
  • client spécifique pour l'automatisation (tests): FileClient = transforme une url en directory path où le client récupère un json qui contient les données de la requête. (note: deja fait à chez nous sous une autre forme). client configurable (directory différents, juste spécifier des headers etc)
  • php 7: eval a compile time avec cette syntaxe eval {$this->dir}/$host

Kevin Dunglas - GraphQL / Rest

  • Rappel sur API Platform: génere l'API, mais aussi le schema (schema.org), le client (react or vuejs) et l'admin (adminonrest)
  • difference entre le composant d'API vs la distribution (qui contient les images docker, les conf kube..)
  • activation graphql doit etre activé manuellement
  • testing: graphiql ds un browser
  • interet du format graphql:

    • requeter only les champs demandés dans la requete
    • demander plusieurs ids d'un coup
    • aggregation de données de plusieurs endpoints!
    • mutation
    • subscription: non implementé en PHP / permet aux serveurs de pusher les modifs
    • système de typage dans la définition des données
    • specification serveur (relay) (vient de react): spécifie un schema
  • exemples de graphql

    • clients mobiles (moins d'I/O)
    • github est en graphql
  • GraphQL doit etre comparé à des API REST Hypermedia!

    • jsonld + hydra sur des entité qui suivent schema.org est comparable aux formats graphql (en plus verbeux mais interoperable entre plusieurs sites (qui implémenteraient le meme schema!) = graphql peut pas le faire na na nère)
    • jsonapi, autre format comparable (utilisé par swagger)
    • rest: groupes de serialization permettent de prédéfinir les champs que l'API renvoie. néanmoins, ce n'est pas le client qui décide de ce qui est renvoyé.
    • rest: sparse fieldsets. verbeux mais permet de définir les champs renvoyés depuis le client. Donc on peut aussi le faire, na na nère.
    • créer des données en graphql : créer une mutation pour permettre de specifier ce que le serveur renvoie
    • LOGS ILLISIBLES en graphql : tout est du POST lol
    • cache = lol en graphql (c'est du POST !). Bon evidemment on peut avoir le meme probleme avec le sparse fieldset en REST mais bon. REST = HTTP = cacheable
    • PERF: les requetes dynamiques peuvent ne pas taper les index en DB... (aussi bien graphql que sparsefieldsets )
    • SECURITE: DDOS-prone ?, on peut créer des requetes monstrueuses? timeout si la requete est trop grosse? limiter la depth? Voir FOV.
    • VERSIONING: en effet graphql n'a pas besoin de versioning car il suffit de déprecier un champ requeêtable. Il ya aussi une bonne pratique pour éviter le versioning sur REST (evolution API)
    • outillage: avantage graphql car ecosysteme JS / facebook
    • philosophie: graphql est specifique a une application / information silo / centralisé là où la linked data (jsonld) est faite pour etre interoperable ( schemas ouvert, communauté scientifique, décentralisation...)
  • faire le choix entre rest et graphql: quels clients ? dyanmisme des données? doit-on query des données qui ne sont pas related entre elles? mais attention à la compatbilité http... perte de gros avantage pour du dynamisme.

  • le bon choix? créer un graphql pour les clients privés / publlic api en REST. ET API PLATFORM PEUT LE FAIRE na na nère.

MobilityWork - Webpack / Encore

  • réexplique la notion de transpiler (Babel), de module ES6 (needing a module loader... like... tada: webpack)
  • le webpack.config.js est super verbeux et complexe... donc... tada: wepback-encore
  • webpack-encore implemente des fonctions de webpack et tout ça
  • WARNING: webpack-encore pas compatible webpack 4

LesTilleuls - Composant Workflow

  • dans le cadre d'une app de recherche personnalisée pr travaux dans le batiment: projet validé / à valider..; = workflow
  • theorie des graphes: cyclique/acyclique, orienté, pondéré.... Si acyclique orienté = machine à etats. non orienté avec 1 seul node root = arbre.
  • le workflow implémente le "petri net" qui est un type de graphe (token / place / arc / transition). une machine à etat est un sous-element d'un petri net càd qu'un token ne peut etre que dans un etat à la fois.
  • mode naïf: on gère une machine à etats avec un mega controleur, avec des état, des if, bla bla. bref caymal.
  • le composant workflow utilise toute cette terminologie hermetique donc hf
  • step 1) definition d'un workflow: définir les place et les transitions, et le type de workflow, si c'est un single state ou multiple state. + l'associer à une entité. possible en yml
  • step 2) verifier si on peut faire evoluer le token dans le workflow avec la methode can(). et utiliser apply() pour passer la transition
  • le composant balance des events sur transition ou autre

[Unconference] - Figaro/CCM - doit-on faire du PHP en 2018 ? #troll

  • mauvaise image de php en general: langage inconsistant / incoherences / pas de multithread...
  • indice TIOBE, google trends sur le keyword PHP, liste des offres d'emploi: php en baisse
  • les top 1000 sites ne sont que 56% a utiliser php, plein de stats pourries
  • pourquoi cet acharnement sur PHP au fait? - low barrier of entry, wordpress, phpnuke, tutoriaux debiles. MAIS a language for its time (ex: FB)
  • use a language for its purpose - a language does not fit all
  • stop gueguerre du "meilleur langage"

Lightning Talks

Nicolas Grekas - How to contribute

  • checker les issues récentes
  • cloner le repo
  • lancer les tests ./phpunit src/Symfony
  • mettre des tests unitaires
  • attention au commit message car squash
  • utiliser la pull request template + ajouter description en dessou
  • note: tous les bug fix sont fixés dans la version la plus basse possible pour ensuite etre mergé ds les versions supérieures
  • la CI symfo: plusieurs combinaisons de plateforme, si ca pete, alors aide de la communauté
  • feedback: symfony communauté a posté un super guide pour handle les feedback sans s'énerver :D Le but des feedback: avoir plus de points de vue

Jolicode - Asynit

  • Tests fonctionnels across multiple services... et on ne peut pas paralleliser car par exemple comment recup le token d'auth sur un service 1 pour un test sur un service 2 si chaque request est executée ds un process different
  • lancer les 2 requetes en async: la 2e va attendre la 1ere (opérateur yield, librairie AMP (reactPHP like mais moins verbeux))
  • next step: CHROME HEADLESS

Sensiolabs - ZSH tips & tricks

  • CTRL+L: clear terminal
  • CTRL+U : suprime la ligne
  • CTRL+W: efface le dernier mot
  • !!: reprendre la dernière commande (note: zsh preview ce qui se cache derrière)
  • !?toto : cherche dans l'historique la dernière commande qui contient text (ca marche qu'une fois)

jeremyfreeagent - remercier symfony

  • idée qui marchera jamais chez nous: créer un canal de remerciements sur slack
  • carte postale ou cupcake à fabpot = badge