2014-01-07 4 views
8

Wie kann ich eine Webseite "Website unter Wartung" einfach und übersichtlich in einer Symfony2 Web App implementieren?'Website unter Wartung' Seite in Symfony2

Ich habe etwas für Symfony 1 gefunden, aber nichts für Symfony2.

Danke.

+0

Würde das helfen? http://stackoverflow.com/questions/16029049/show-maintenance-page-when-lock-file-ispresent Ich weiß, dass die Lösung nicht veröffentlicht wird, aber es kann Ihnen eine Richtung geben, wo Sie suchen müssen –

+0

Die Lösung scheint Für mich ist es egal, unabhängig vom Framework: Habe eine Konfigurationsdatei, die aufzeichnet, ob die Site gewartet wird, wahrscheinlich auf einer niedrigen Ebene wie bei einem Frontcontroller irgendwo überprüft wird und auf eine HTML-Seite umleitet, falls dies der Fall ist. – halfer

Antwort

20

Ich folgte dieser tutorial. Es ist sehr einfach und unkompliziert. Das war genau was ich brauchte. Sie müssen nur einen Parameter ändern und dann den Prod-Cache löschen, und Sie können weiterhin auf die Anwendung in der Entwicklungs- oder Testumgebung zugreifen.

In Ihrem parameters.yml hinzufügen:

parameters: 
    maintenance: false #turn it to true to enable maintenance 
    underMaintenanceUntil: tomorrow 8 AM 

Dann definieren Sie einen Service:

services: 
    acme.listener.maintenance: 
     class: Acme\DemoBundle\Listener\MaintenanceListener 
     arguments: 
      container: "@service_container" 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

Und schließlich den Ereignis-Listener:

<?php 

namespace Acme\DemoBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class MaintenanceListener 
{ 
    private $container; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $maintenanceUntil = $this->container->hasParameter('underMaintenanceUntil') ? $this->container->getParameter('underMaintenanceUntil') : false; 
     $maintenance = $this->container->hasParameter('maintenance') ? $this->container->getParameter('maintenance') : false; 

     $debug = in_array($this->container->get('kernel')->getEnvironment(), array('test', 'dev')); 

     if ($maintenance && !$debug) { 
      $engine = $this->container->get('templating'); 
      $content = $engine->render('::maintenance.html.twig', array('maintenanceUntil'=>$maintenanceUntil)); 
      $event->setResponse(new Response($content, 503)); 
      $event->stopPropagation(); 
     } 

    } 
} 

Dann müssen Sie nur noch Fügen Sie die Vorlagendatei hinzu, auf die in $content = $engine->render('::maintenance.html.twig', array('maintenanceUntil'=>$maintenanceUntil)); verwiesen wird, und Ihre Strafe. Verwenden Sie {{ maintenanceUntil }}, um die in parameters.yml definierte Nachricht anzuzeigen.

+0

Ich habe dies zu meinem symfony 2.7-Projekt hinzugefügt, aber es funktioniert nur korrekt, wenn ich den Prod-Cache lösche, nachdem ich den Wartungsparameter im Yml geändert habe. Es hat keine Wirkung, wenn ich den Cache nicht lösche. Gibt es eine Möglichkeit, diesen zusätzlichen Schritt zu vermeiden? – edditor

+0

Kurze Antwort, nein. Parameter sind auch im Cache gespeichert. –

+0

Sie haben Recht. Ich habe es getestet und die Konfigurationsdateien werden zwischengespeichert. Aber vielleicht gibt es eine bequeme Lösung, um einen Befehl zu erstellen, der den Yml ändert und dann den Cache löscht. Ich werde das morgen versuchen. – edditor