2016-08-09 2 views
1

'web_enabled'키가있는 구성 테이블이 있습니다. 요청한 경로를 표시하고 싶지만 false 일 경우 '유지 관리중인 사이트'페이지를 표시하고 싶습니다. 분명히이 점검은 어떤 루트 액션보다 먼저 수행되어야합니다.Symfony 3.1 데이터베이스에 대한 액세스 권한이있는 수신자

나는 이벤트와 리스너에 대해 읽었지 만 교리와 템플릿에 대한 액세스를 구현하는 방법을 알지 못합니다.

도움 주셔서 감사합니다.

# 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 } 

리스너 :

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

당신은 당신의 리스너에 EntityManager의 지정 및 템플릿 모두를 주입해야 왜냐하면 나는 service.yml에서 매개 변수를 사용하지 않기 때문에 Alsatian에 의해 제안 된 것에서부터. 취향에 대한 질문 일뿐입니다. 응용 프로그램/설정/services.yml에서

SRC에서

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

/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')); 

    } 
} 

및 SRC/AppBundle/저장소에

/ConfigRepository.php가 getconfig을 설명 방법

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; 
     } 
    } 

}

희망이 도움이됩니다.

+0

가 잡아낼 치명적인 오류 : AppBundle에 전달 된 인수 1 \의 EventListener \ RequestListener :: onKernelController을() 심포니 \ 구성 요소의 인스턴스 여야합니다 \ HttpKernel은 \ 이벤트 \ GetResponseEvent, 심포니 \ 구성 요소의 인스턴스는 \ HttpKernel \ 이벤트 \ FilterControllerEvent는 – Carlos

+0

을 그 것 주어진 내가 얻는 것. FilterControllerEvent에 대한 참조가 보이지 않습니다. ??? 이것은 나를 잃어 버렸다. – Carlos

+0

감사합니다. 알자스. 나는 당신의 평가와 함께 구현 한 솔루션을 여기에 올릴 것입니다. – Carlos

1

이 드디어 구현의 해결책이, 다릅니다 서비스로

정의 :

+0

아? web_installed가 엔티티 속성입니까? undestand 그것을하지 않았다;) – Alsatian

+0

걱정하지 마세요, 당신의 코드와 나는 같은 질문을 가진 다른 사람들이 서비스 매개 변수와 엔티티와 함께 ​​두 가지 해결책을 갖게됩니다. :-). – Carlos

관련 문제