2013-06-25 37 views
6

Có thể thiết lập trình xử lý sự kiện (hoặc làm gì đó khác không?) Để nghe tất cả các sự kiện được ứng dụng Symfony 2 AppKernel kích hoạt cho một yêu cầu cụ thể?Lắng nghe tất cả các sự kiện trong Symfony 2

Tức là, tôi biết tôi có thể duyệt ứng dụng với app_dev.php và sử dụng trình hồ sơ để xem danh sách tất cả các người nghe , nhưng tôi quan tâm đến việc lấy danh sách mọi sự kiện đã được gửi đi/bị sa thải. Tôi biết một số hệ thống sự kiện có một người nghe toàn cầu đặc biệt/tất cả những gì sẽ cho phép tôi nhận được mọi sự kiện. Tôi tự hỏi nếu Symfony có một cái gì đó tương tự, hoặc nếu có một cơ chế khác để có được một danh sách tất cả các sự kiện có sẵn trên một trang cụ thể.

Tôi cũng biết tôi có thể thêm một số mã sửa lỗi tạm thời để một trong những sự kiện các lớp phối

Symfony/Component/EventDispatcher/EventDispatcher.php 
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php 
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php 

nhưng tôi đang tìm kiếm cái gì đó là ít hơn của một hack/ít phá hủy.

Mới đối với Symfony, nhưng không mới đối với lập trình. Xin lỗi nếu đây là một câu hỏi ngây thơ, nhưng googling về đã không tiết lộ những gì tôi sau.

Trả lời

6

Cách sạch sẽ là tạo EventDispatcher của riêng bạn thực hiện việc ghi nhật ký hoặc bất cứ điều gì bạn đang cố gắng làm nếu một sự kiện xảy ra. Hãy xem default one để biết cách hoạt động của nó.

Bây giờ đầu tiên tạo ra các lớp

use Symfony\Component\EventDispatcher\EventDispatcher; 

class MyDispatcher extends EventDispatcher 
{ 

    // sadly those properties aren't protected in EventDispatcher 
    private $listeners = array(); 
    private $sorted = array(); 


    public function dispatch($eventName, Event $event = null) 
    { 
     if (null === $event) { 
      $event = new Event(); 
     } 

     $event->setDispatcher($this); 
     $event->setName($eventName); 

     // do something with the event here ... i.e. log it 

     if (!isset($this->listeners[$eventName])) { 
      return $event; 
     } 

     $this->doDispatch($this->getListeners($eventName), $eventName, $event); 

     return $event; 
    } 

... sau đó đăng ký MyDispatcher của bạn như mặc định một symfony.

(bằng cách ghi đè các dịch vụ event_dispatcher gốc)

app/config/config.yml

services: 
    event_dispatcher: 
     class: Vendor\YourBundle\MyDispatcher 
     arguments: [@service_container] 

... hoặc thậm chí đơn giản chỉ ghi đè class parameter được sử dụng bởi symfony khi tạo dịch vụ .

parameters: 
    event_dispatcher.class: Vendor\YourBundle\MyDispatcher 
+0

Cảm ơn - đó chính xác là những gì tôi đang tìm kiếm. Một câu hỏi tiếp theo chủ yếu là ngoài chủ đề nhưng tiếp tuyến. Gói của tôi có tự động tìm kiếm 'config_prod.yml',' config_dev.yml', v.v. hoặc tôi có thể thực hiện việc này không? –

+1

bạn phải thông báo cho các gói của bạn có cấu hình tệp để tải bên trong tiện ích mở rộng của gói được tìm thấy trong /DependencyInjection/BundleNameExtension.php. Phương thức 'load()' của tệp này sẽ được tự động thực hiện bởi symfony nếu tập tin được đặt tên đúng. Không có logic cụ thể về môi trường trong đó một cách tự nhiên – nifr

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