Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony 4

Symfony 4

Une nouvelle expérience de développement

Titouan Galopin

June 19, 2018
Tweet

More Decks by Titouan Galopin

Other Decks in Programming

Transcript

  1. Symfony 4
    Une nouvelle expérience de
    développement
    Juin 2018
    AFUP Limoges

    View Slide

  2. Titouan Galopin
    Product Lead à Symfony
    2

    View Slide

  3. Symfony 4
    Versionnement sémantique
    3

    View Slide

  4. Symfony 4
    Symfony 4 = Symfony 3.4
    sans la couche de compatibilité …
    4

    View Slide

  5. Symfony 4
    Symfony 4 = Symfony 3.4
    sans la couche de compatibilité …
    … mais aussi bien plus que ca !
    5

    View Slide

  6. Symfony 4
    Réévaluation de toutes les idées de Symfony pour les
    adapter au développement en 2018
    6

    View Slide

  7. Symfony 4
    Réévaluation de toutes les idées de Symfony pour les
    adapter au développement en 2018
    Plus facile à apprendre / configurer / utiliser / déployer
    Framework PHP le plus rapide du marché
    7
    phpbenchmarks.com

    View Slide

  8. Symfony 4
    PHP 7.1+
    Migration 3 => 4 simplifiée par le système
    de dépréciations
    8

    View Slide

  9. 9
    ├── bin/console
    ├── config
    │ ├── bundles.php
    │ ├── packages
    │ │ ├── dev/routing.yaml
    │ │ ├── framework.yaml
    │ │ ├── routing.yaml
    │ │ └── test/framework.yaml
    │ ├── routes.yaml
    │ └── services.yaml
    ├── public/index.php
    └── src
    ├── Controller
    └── Kernel.php
    Nouvelle structure
    Projet vide :
    - 13 fichiers
    - 4 dépendances directes

    View Slide

  10. Symfony Flex
    composer create-project
    symfony/skeleton mydir
    10

    View Slide

  11. 11

    View Slide

  12. Symfony Flex
    Plugin Composer
    Au moment de l’installation d’un package,
    Symfony Flex le configure automatiquement
    12

    View Slide

  13. Sans Flex
    - composer require bundle
    - Ajouter une ligne dans
    app/AppKernel.php
    - Créer la configuration dans
    app/config/config.yml
    - Importer le routing dans
    app/config/routing.yml
    Installation d’un bundle
    Avec Flex
    - composer require bundle
    13

    View Slide

  14. Symfony Flex
    composer require symfony/monolog-bundle
    14

    View Slide

  15. 15

    View Slide

  16. Symfony Flex
    Définit un écosystème à partir d’alias officiels
    16

    View Slide

  17. Symfony Flex
    composer require logger
    17

    View Slide

  18. 18

    View Slide

  19. Symfony Flex
    Besoin d’un ORM ?
    composer require orm
    Besoin de Twig ?
    composer require twig
    19

    View Slide

  20. Symfony Flex
    Besoin d’une API ?
    composer require api
    Besoin d’une interface d’admin ?
    composer require admin
    20

    View Slide


  21. Mais comment ca marche ?
    21

    View Slide

  22. Symfony Flex
    Système de “recettes” :
    Décrit comment un package doit être configuré
    https://symfony.sh
    2 types : officielles et contrib
    22

    View Slide

  23. Symfony Flex
    Plus de bundle d’application !
    Nouveau kernel pour charger la configuration
    23

    View Slide

  24. 24

    View Slide

  25. Le maker bundle

    View Slide

  26. Le maker bundle
    composer require maker
    26

    View Slide

  27. Le maker bundle
    Un générateur
    qui fait bien les
    choses
    27
    make:auth
    make:command
    make:controller
    make:crud
    make:entity
    make:fixtures
    make:form
    make:functional-test
    make:migration
    make:serializer:encoder
    make:subscriber
    make:twig-extension
    make:unit-test
    make:validator
    make:voter

    View Slide

  28. 28

    View Slide

  29. L’intégration dans les
    infrastructures
    modernes

    View Slide

  30. L’intégration dans les infrastructures modernes
    Deux types de caches
    30

    View Slide

  31. Deux types de cache
    31
    Cache système :
    - Container compilé
    - Templates Twig
    compilés
    - Metadata Doctrine
    ...
    Cache applicatif :
    Vos données à mettre en
    cache

    View Slide

  32. Deux types de cache
    32
    Cache système :
    Ne change pas au cours de
    la vie de l’application
    (read-only)
    Cache applicatif :
    Change au cours de la vie
    de l’application

    View Slide

  33. Deux types de cache
    33
    Cache système :
    N’a pas besoin d’être
    synchronisé entre plusieurs
    instances frontales
    Cache applicatif :
    Doit être synchronisé entre
    plusieurs instances
    frontales

    View Slide

  34. Deux types de cache
    34
    Cache système :
    Filesystem
    Cache applicatif :
    Votre backend
    (Redis, PDO, …)

    View Slide

  35. Deux types de cache
    35
    framework:
    cache:
    app: cache.adapter.redis
    default_redis_provider: 'redis://%env(REDIS_HOST)%'

    View Slide

  36. L’intégration dans les infrastructures modernes
    Les variables d’environnement
    36

    View Slide

  37. Les variables d’environnement
    .env
    Intégré dans les recettes
    Référençable dans la configuration de services
    37

    View Slide

  38. 38

    View Slide

  39. L’injection de
    dépendances

    View Slide

  40. L’injection de dépendances
    Probablement le composant qui a le plus changé en 3.4/4.0
    40
    - Autodiscovery
    - Autowiring
    - Autoconfiguration
    - Defaults
    - Bindings
    - Services taggués
    - Controllers as services

    View Slide

  41. Comment fonctionne le composant DependencyInjection ?
    41
    class Persister {/* ... */}
    class Mailer {/* ... */}
    class RegistrationManager
    {
    private $persister;
    private $mailer;
    public function __construct(
    Persister $persister,
    Mailer $mailer
    ) { /* ... */ }
    public function register() {}
    }
    Objectif :
    $manager = new RegistrationManager(
    new Persister($doctrine),
    new Mailer($twig, $swiftmailer)
    );

    View Slide

  42. Comment fonctionne le composant DependencyInjection ?
    42
    Mailer Persister
    RegistrationManager
    Swiftmailer Twig Doctrine

    View Slide

  43. L’injection de dépendances
    Configuration => Graphe => Container compilé
    43

    View Slide

  44. L’injection de dépendances
    En Symfony 3, pour configurer ce graphe :
    app/config/services.yml
    44

    View Slide

  45. L’injection de dépendances
    Symfony 4 introduit différentes automatisations
    pour créer ce graphe plus simplement
    45

    View Slide

  46. L’injection de dépendances
    Identifiant de service = Nom complet de la classe
    46

    View Slide

  47. Identifiant de service = nom complet de la classe
    47
    Symfony 3
    app.mailer:
    class: AppBundle\Mailer\Mailer
    arguments: ['@twig', '@mailer']
    app.persister:
    class: AppBundle\Doctrine\Persister
    arguments: ['@doctrine']
    app.registration_manager:
    class: AppBundle\Registration\RegistrationManager
    arguments: ['@app.persister', '@app.mailer']

    View Slide

  48. Identifiant de service = nom complet de la classe
    48
    Symfony 4
    App\Mailer\Mailer:
    arguments: ['@twig', '@mailer']
    App\Doctrine\Persister:
    arguments: ['@doctrine']
    App\Registration\RegistrationManager:
    arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer']

    View Slide

  49. Identifiant de service = nom complet de la classe
    49
    Symfony 4
    App\Mailer\Mailer:
    arguments: ['@twig', '@mailer']
    App\Doctrine\Persister:
    arguments: ['@doctrine']
    App\Registration\RegistrationManager:
    arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer']
    Permet $container->get(Mailer::class) !

    View Slide

  50. L’injection de dépendances
    Autodiscovery + Autowiring
    50

    View Slide

  51. Autodiscovery + Autowiring
    51
    App\Mailer\Mailer:
    arguments: ['@twig', '@mailer']
    App\Doctrine\Persister:
    arguments: ['@doctrine']
    App\Registration\RegistrationManager:
    arguments: ['@App\Doctrine\Persister', '@App\Mailer\Mailer']
    App\:
    resource: '../src/*'

    View Slide

  52. Comment fonctionne le composant DependencyInjection ?
    52
    Mailer Persister
    RegistrationManager
    Swiftmailer Twig Doctrine
    Autodiscovery
    Autowiring

    View Slide


  53. L’autowiring n’a rien de magique
    Il est basé uniquement sur les noms
    de classes et des typehints
    53

    View Slide

  54. Comment fonctionne le composant DependencyInjection ?
    54
    class Persister {/* ... */}
    class Mailer {/* ... */}
    class RegistrationManager
    {
    private $persister;
    private $mailer;
    public function __construct(Persister $persister, Mailer $mailer)
    { /* ... */ }
    public function register() {}
    }
    Nom des services
    à injecter
    = typehints

    View Slide

  55. L’injection de dépendances
    Defaults + Autoconfiguration
    55

    View Slide

  56. Defaults + Autoconfiguration
    56
    services:
    _defaults:
    autowire: true
    autoconfigure: true
    public: false
    App\:
    resource: '../src/*'
    Defaults (par fichier) :
    Les nouvelles
    fonctionnalités
    sont opt-in
    Services privés
    par défaut

    View Slide

  57. Defaults + Autoconfiguration
    57
    services:
    _defaults:
    autowire: true
    autoconfigure: true
    public: false
    App\:
    resource: '../src/*'
    Defaults (par fichier) : Autoconfiguration :
    Configure
    automatiquement les
    services en fonctions des
    interfaces qu’ils
    implémentent

    View Slide

  58. L’injection de dépendances
    Bindings : et les paramètres ?
    58

    View Slide

  59. Bindings
    59
    services:
    # pour un service précis
    App\Registration\RegistrationManager:
    arguments:
    $projectDir: '%kernel.project_dir%'
    # pour tous les services du fichier
    _defaults:
    bind:
    $projectDir: '%kernel.project_dir%'
    Automatise
    l’injection des
    paramètres

    View Slide

  60. L’injection de dépendances
    Controllers as services
    Les contrôleurs sont des services
    60

    View Slide

  61. Controllers as services
    61
    services:
    App\Controller\:
    resource: '../src/Controller'
    tags: ['controller.service_arguments']
    # public function contact(Request $request,
    Mailer $mailer) { // ... }
    Le tag permet
    d’injecter les
    services en
    paramètres de
    l’action

    View Slide

  62. Comment fonctionne le composant DependencyInjection ?
    62
    Mailer Persister
    RegistrationManager
    Swiftmailer Twig Doctrine
    RegistrationController

    View Slide

  63. L’injection de dépendances
    Services taggués
    63

    View Slide

  64. L’injection de dépendances
    64
    services:
    App\Manager\TwigManager:
    arguments: [!tagged twig.extension]

    View Slide

  65. 65

    View Slide

  66. 66
    Contribuez !
    symfony.com/support => Slack
    Pinguez Nicolas Grekas

    View Slide

  67. 67
    Merci !
    Questions ? Bières ?
    ▪ Twitter : @titouangalopin
    ▪ Github : @tgalopin
    [email protected]

    View Slide