Menu

Système de maintenance sur un projet Symfony 4

Aujourd'hui, nous allons voir comment mettre en maintenance tout notre site web Symfony 4 pour les utilisateurs.
Cette technique permettra de geler le site pour empêcher certaines actions des utilisateurs pendant votre maintenance.

Commençons

Tout d'abord nous allons vérifier que nous avons bien tous les composants nécessaires sur notre projet.
Nous allons donc les installer à l'aide de composer.

SSH
~ composer require twig ~ composer require symfony/templating

La configuration

Maintenant, configurons notre maintenance.
Dans le fichier config/services.yaml ajouter les lignes manquantes :

YAML
parameters: maintenance: statut: false ipAuthorized: ["::1","192.168.1.101"]
YAML
services: App\EventListener\MaintenanceListener: tags: - { name: kernel.event_listener, event: kernel.request } arguments: ['%maintenance%']

Nous avons dans les paramètres un tableau nommé "maintenance" contenant deux valeur :

  • Le statut : Désigne si la maintenance est activé ou non.
  • ipAuthorized : Désigne les ip autorisées à acceder au site quand ce dernier est en maintenance.

Dans le fichier config/packages/framework.yaml, ajouter la ligne suivante :

YAML
framework: templating: engines: ['twig']

Pour la dernière étape, vous aller créer le fichier suivant src/EventListener/MaintenanceListener.php (avec le dossier si il n'existe pas encore).
Puis vous allez coller ce code dans ce fichier :

PHP
<?php namespace App\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; class MaintenanceListener { private $container, $maintenance, $ipAuthorized; public function __construct($maintenance, ContainerInterface $container) { $this->container = $container; $this->maintenance = $maintenance["statut"]; $this->ipAuthorized = $maintenance["ipAuthorized"]; } public function onKernelRequest(GetResponseEvent $event) { // This will get the value of our maintenance parameter $maintenance = $this->maintenance ? $this->maintenance : false; $currentIP = $_SERVER['REMOTE_ADDR']; // This will detect if we are in dev environment (app_dev.php) // $debug = in_array($this->container->get('kernel')->getEnvironment(), ['dev']); // If maintenance is active and in prod environment if ($maintenance AND !in_array($currentIP, $this->ipAuthorized)) { // We load our maintenance template $engine = $this->container->get('templating'); $template = $engine->render('maintenance/maintenance.html.twig'); // We send our response with a 503 response code (service unavailable) $event->setResponse(new Response($template, 503)); $event->stopPropagation(); } } }

Il ne vous reste plus qu'à créer votre page de maintenance tel que templates/maintenance/maintenance.html.twig !



Catégorie :
Symfony 4
Vues :
2421