2018-03-30: SF Live 2018
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 queisset(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 utiliserapply()
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 terminalCTRL+U
: suprime la ligneCTRL+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