2016-08-09 72 views
1

Ich habe eine Config-Tabelle mit einem 'web_enabled' Schlüssel, wenn true Ich möchte die Route angefordert, aber wenn falsch, ich möchte eine 'Site in Wartung' Seite anzeigen. Offensichtlich muss diese Überprüfung vor jeder Routenaktion durchgeführt werden.Symfony 3.1 Listener mit Zugriff auf die Datenbank

Ich habe über Ereignisse und Listener gelesen, aber ich sehe nicht, wie Sie den Zugriff auf die Lehre und Vorlage implementieren.

Danke für die Hilfe.

Antwort

0

Sie müssen nur beide EntityManager und Templating in Ihrer Zuhörer injizieren:

Definition als Dienst:

# src/AppBundle/Ressources/config/services.yml 
services: 
    app.request_listener: 
     class: AppBundle\EventListener\RequestListener 
     arguments: ["%web_enabled%","@doctrine.orm.entity_manager","@templating"] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

Zuhörer:

namespace AppBundle\EventListener; 

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

class RequestListener 
{ 
    private $configKey; 
    private $em; 
    private $templating; 

    public __construct($configKey, $em, $templating) 
    { 
     $this->configKey = $configKey; 
     $this->em = $em; 
     $this->templating = $templating; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     if(!$this->configKey){ 
      $var = $this->em->getRepository('AppBundle:MyEntity')->findOne(1); 

      $event->setResponse($this->templating->renderResponse('my_template.html.twig',array('var'=>$var)); 
     } 
    } 
} 
+0

Abfangbare Fatal Error: Argument 1 bis AppBundle geben \ Eventlistener \ RequestListener :: onKernelController() muss eine Instanz von Symfony \ Component sein \ HttpKernel \ Ereignis \ GetResponseEvent, Instanz von Symfony \ Component \ HttpKernel \ Ereignis \ FilterControllerEvent – Carlos

+0

gegeben das ist was ich bekomme. Ich sehe keinen Hinweis auf FilterControllerEvent. Das hat mich verloren. – Carlos

+0

Dank Elsässisch. Ich werde hier die Lösung posten, die ich mit Ihrer Einschätzung umgesetzt habe. – Carlos

1

Dies ist die Lösung, die ich endlich umgesetzt werden, unterscheidet sich aus dem Vorschlag von Elsässer, weil ich keinen Parameter in der service.yml verwenden. Ist nur eine Frage des Geschmacks, sonst nichts.

in app/config/services.yml

services: 
app.request_listener: 
    class: AppBundle\EventListener\RequestListener 
    arguments: ["@doctrine.orm.entity_manager","@templating"] 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelController } 

in src/AppBundle/Eventlistener/RequestListener.php

namespace AppBundle\EventListener; 

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

class RequestListener 
{ 
    private $em; 
    private $templating; 

    public function __construct($em, $templating) 
    { 
     $this->em = $em; 
     $this->templating = $templating; 
    } 

    public function onKernelController(GetResponseEvent $event) 
    { 
     if (!$this->configKey = $this->em->getRepository('AppBundle:Config')->getconfig('web_enabled')) 
      $event->setResponse($this->templating->renderResponse('default/construction.html.twig')); 

    } 
} 

und in src/AppBundle/Repository/ConfigRepository.php Erläuterung des getconfig Methode:

namespace AppBundle\Repository; 

class ConfigRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function getconfig($config_name) 
    { 
     $config = $this->getEntityManager() 
     ->createQuery('SELECT p.config_value FROM AppBundle:Config p WHERE p.config_name = :config_name') 
     ->setParameter('config_name', $config_name) 
     ->getResult(); 
     if (sizeof($config)){ 
      return $config[0]['config_value']; 
     }else{ 
      return false; 
     } 
    } 

}

Hoffe, das hilft.

+0

Ah? web_installed war eine Entitätseigenschaft? Habe es nicht so verstanden;) – Alsatian

+0

Keine Sorge, mit deinem Code bekomme ich die Idee und andere mit der gleichen Frage werden die beiden Lösungen haben, mit einem Service-Parameter und mit einer Entität. :-). – Carlos