Cela fait maintenant plus de 6 mois que Symfony 4 est sorti (30 novembre 2017). Le principal changement de Symfony 4 est sans aucun doute la manière d’initialiser un projet mais aussi d’ajouter des fonctionnalités.

⚠️ N’oubliez pas que Symfony 4 requiert maintenant PHP 7.1.3 minimum !

Flex

Cette nouvelle manière d’initialiser un projet Symfony utilise un nouvel outil nommé Flex. Flex est un plugin composer destiné à aider le développeur à créer des applications Symfony.

ℹ️ C’est pourquoi il remplace naturellement la Symfony standard edition mais aussi l’installeur Symfony.

Pour ce faire Flex utilise des recipes (ɹɛ.sɪ.piz). Une recipe est un fichier manifest.json qui contient différentes actions à effectuer durant l’installation d’un composant logiciel. Il permet entre autres de créer des dossiers, copier des fichiers de configuration, ajouter des variables d’environnement (.env) etc… Pour la liste complète des actions, je vous laisse consulter la documentation.

Les recipes sont stockées dans deux repository :

  • main recipes repository qui regroupe les recipes de haute qualité. Repository par défaut de Flex.
  • contrib recipes repository qui regroupe les recipes créé par la communauté, Flex demandera votre permission avant l’installation de ces recipes.

ℹ️ On voit également l’apparition du site symfony.sh qui permet de trouver des recipes.

Utilisation

Ok, nous allons maintenant voir comment initialiser un projet Symfony 4 avec Flex.

$ composer create-project symfony/website-skeleton my-project

ℹ️ La recipe symfony/skeleton est également disponible si vous souhaitez initialiser un projet plus léger. En effet elle ne requiert que :

  • symfony/console
  • symfony/flex
  • symfony/framework-bundle
  • symfony/lts
  • symfony/yaml

Normalement Flex vous aura créé la structure de dossier suivante.

assets        les fichiers ressources statics (image, js, css, ...)
bin           les executables (console, phpunit, ...)
config        les fichiers de configuration de l'application
public        les fichiers disponibles en web (front controller index.php)
src           les fichiers sources de l'application
templates     les fichiers de templating (twig, html, ...)
tests         les fichiers de tests
translations  les fichiers de traduction
var           les fichiers temporaires (cache, logs, upload, ...)
vendor        les fichiers des librairies tièrces

Pour avoir votre première page fonctionnelle :

  • crée le template dans le fichier my-project/templates/index.html.twig
{% extends 'base.html.twig' %}
{% block body %}Bienvenue{% endblock %}
  • crée le controller dans le fichier my-project/src/Controller/DefaultController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="index")
     */
    public function index()
    {
        return $this->render('index.html.twig');
    }
}

Attention, le nom des contrôleurs n’est plus suffixé de Action

Mais où sont les bundles ?

La bonne nouvelle c’est que vous n’êtes plus obligés d’avoir de bundle dans le dossier src (AppBundle). La mauvaise nouvelle c’est… heu… Ha non il n’y en a pas ! Le seul changement concernant les bundles c’est qu’il faut maintenant les enregistrer dans le fichier config/bundles.php.

<?php

return [
    // ...
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true],
    // ...
];

Conclusion

Avant Symfony 4 nous avions plusieurs choix :

  • Utiliser une distribution Symfony (standard, cmf-standard, rest …) et/ou un microkernel.

    Solution prête à l’emploi (ORM, swiftmailer, twig, …). Mais pouvant embarquer des fonctionnalités non voulues (obligation de changer/désactiver).

  • Utiliser les composants de symfony comme des librairies tierces et/ou utilisation de Silex

    Solution plus légère. Requiert une bonne connaissance des composants et librairies pour pouvoir initialiser le tout avec du cache, de la configuration.

Symfony 4 a donc été retravaillé afin que l’installation n’embarque plus de superflu. Il facilite l’ajout des fonctionnalités dont vous avez besoin selon le cycle de vie de votre projet.

Pour finir, voici mon top 3 parmi les changements de Symfony 4.0 :

  • Nouvelle structure de dossier.
  • Le LockHandlera disparu en faveur de Symfony\Component\Lock\Store\FlockStore/Symfony\Component\Lock\Store\FlockStore\SemaphoreStore
  • Le composant ClassLoader a disparu en faveur de l’autoload de composer.

PS : Je ne peux que vous conseiller de revisiter la liste des composants de Symfony, car dorénavant vous devrez soit utiliser une recipe existante soit composer votre besoin avec les composants et librairies tierces.