2012-05-29 32 views
5

Vì vậy, tôi đang cố gắng để tìm ra những người nghe nhưng tôi đang gặp vấn đề tìm thấy bất kỳ thông tin trên trang web symfony về họ ..Symfony2 kiện nghe

Ban đầu, tôi muốn tạo ra một người biết lắng nghe mà sẽ kích hoạt trên mỗi lần tải trang ... Tôi cho rằng điều đó có thể gây bất lợi cho hiệu suất hệ thống tổng thể, do đó tôi nghĩ rằng nó chỉ kích hoạt trên:/và/otherpage

Nhưng một lần nữa, tôi gặp sự cố khi tìm bất kỳ thông tin nào về vị trí bắt đầu với người nghe. Bất kỳ trợ giúp nào được đánh giá cao .. Tất cả người nghe này sẽ làm, đang sử dụng Doctrine để kiểm tra cơ sở dữ liệu và thiết lập một phiên dựa trên những gì nó tìm thấy ..

Một lần nữa, bất kỳ trợ giúp hoặc đề xuất nào được đánh giá cao. Cảm ơn.

Trả lời

10

Tôi làm điều gì đó tương tự để kiểm tra tên miền phụ không thay đổi. Bạn có thể đặt người nghe vào như một dịch vụ trong tập tin cấu hình của bạn như sau:

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 } 

Tôi không chắc chắn chính xác như thế nào ưu tiên các công trình nhưng tôi đã tìm thấy nếu nó đặt quá cao nó sẽ không chạy trước phần còn lại của ứng dụng. Đó là trong danh sách việc cần làm của tôi để nghiên cứu thêm một chút nữa.

Dưới đây là ví dụ về cách người nghe có thể xem.

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... 

    } 
} 

Tôi không chắc chắn về cách tốt nhất để đặt nhóm này chỉ chạy trên các trang nhất định, nhưng tôi đoán tốt nhất sẽ được kiểm tra các tuyến đường và chỉ nhấn db của bạn nó khi các trận đấu đường bất cứ điều gì bạn đặt.

Hy vọng bạn sẽ bắt đầu!

Greg

+0

Cảm ơn thông tin Greg! Tôi sẽ có một cuộc chơi xung quanh và xem những gì tôi có thể đi lên với điều này ... Tôi thậm chí có thể có được bằng cách có nó kiểm tra trên mỗi tải trang (tất cả các truy vấn sẽ làm là kiểm tra DB để xem nếu có là một mục nhập cho ngày hôm nay cho người dùng hay không) .. Cảm ơn một lần nữa! – Justin

+0

Không sao cả. Tôi sẽ không lo lắng quá nhiều về việc gọi chức năng nghe trên mỗi lần tải trang, đó là một dịch vụ nhỏ đến nỗi nó không ảnh hưởng đến hiệu suất, chỉ cố gắng tìm cách tránh người nghe nhấn DB mỗi lần trừ khi nó đặc biệt cần. Hãy cho tôi biết làm thế nào bạn đi, hạnh phúc để thử và giúp đỡ nếu bạn có bất kỳ vấn đề. – greg

+0

Tôi đang làm điều tương tự, nhưng nếu không tìm thấy gì trong truy vấn Trình nghe, tôi muốn tóm tắt mọi thứ và chuyển hướng đến trang mẫu "Sắp ra mắt". Bất kỳ suy nghĩ về cách xây dựng mà trong Listener? Cảm ơn! – Acyra

Các vấn đề liên quan