2012-05-29 4 views
5

Итак, я пытаюсь выяснить, эти слушатель, но у меня возникают проблемы с поиском какой-либо информации на сайте симфони о них ..Symfony2 слушатель события

Изначально я хотел создать слушатель, который бы вызвать на каждая загрузка страницы ... Я полагал, что это может нанести ущерб общей производительности системы, поэтому я подумал о том, что она срабатывает только на:/и/otherpage

Но опять же, у меня возникают проблемы с поиском любой информации о том, где начните с слушателя. Любая помощь будет оценена. Все это слушатель будет делать, использует Doctrine для проверки базы данных и установки сеанса на основе того, что она находит.

Опять же, любая помощь или предложения оценены. Благодарю.

ответ

10

Я делаю что-то подобное, чтобы проверить, что субдомен не изменился. Вы можете поместить слушателя в качестве сервиса в вашем конфигурационном файле следующим образом:

services: 
    page_load_listener: 
     class: Acme\SecurityBundle\Controller\PageLoadListener 
     arguments: 
      security: "@security.context", 
      container: "@service_container" 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 64 } 

Я не совсем уверен, как приоритет работы, но я нашел, если он установлен слишком высоко он не будет работать, прежде чем остальные приложения. Это в моем списке дел, чтобы исследовать немного больше.

Вот пример того, как слушатель мог смотреть.

namespace Acme\SecurityBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 

class PageLoadListener extends controller 
{ 
    private $securityContext; 
    protected $container; 
    protected $query; 

    public function __construct(SecurityContext $context, $container, array $query = array()) 
    { 
     $this->securityContext = $context; 
     $this->container = $container; 
     $this->query = $query; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    {  
     //if you are passing through any data 
     $request = $event->getRequest(); 

     //if you need to update the session data 
     $session = $request->getSession();    

     //Whatever else you need to do... 

    } 
} 

Я не уверен, что лучший способ, чтобы установить его работать только на определенных страницах, но моя догадка была бы проверить маршрут и только ударить БД, когда маршрут соответствует все, что вы установите.

Надеюсь, что вы начнете!

Greg

+0

Спасибо за информацию Greg! У меня будет возможность поиграть и посмотреть, что я могу с этим справиться ... Я бы даже смог обойтись, проверяя каждую загрузку каждой страницы (все запросы будут проверять БД, чтобы увидеть, есть ли там это запись на сегодня для пользователя или нет) .. Еще раз спасибо! – Justin

+0

Нет проблем. Я бы не стал слишком беспокоиться об этом, вызвав функцию слушателя при каждой загрузке страницы, это такая крошечная услуга, что она не должна влиять на производительность, просто попробуйте выработать способ избежать прослушивателя, ударяющего DB каждый раз за исключением случаев, когда это необходимо. Дайте мне знать, как вы идете, с удовольствием попробуйте помочь, если у вас возникнут проблемы. – greg

+0

Я делаю то же самое, но если ничего не найдено в запросе Listener, я хочу закоротить все и перенаправить на страницу шаблона «Скоро». Любые мысли о том, как построить это в Слушателе? Благодаря! – Acyra

Смежные вопросы