2012-04-26 47 views
6

Theo trang doc này:Ghi đè ngoại lệ Symfony 2?

http://symfony.com/doc/current/cookbook/controller/error_pages.html

Symfony sử dụng TwigBundle để điều khiển màn hình của trường hợp ngoại lệ. Tuy nhiên, tôi không tìm cách tùy chỉnh màn hình, như đã đề cập trong tài liệu, tôi đang tìm cách ghi đè điều này. Tôi đang làm việc trên một API REST nhỏ và tôi muốn ghi đè lời gọi của TwigBundle vào gói của mình, xử lý các ngoại lệ của riêng tôi (về REST: ánh xạ các mã trạng thái HTTP đúng và các câu trả lời của văn bản thuần).

Tôi không thể tìm thấy bất cứ điều gì về điều này và tham chiếu trên hướng dẫn không phải là tốt, đặc biệt trên phần hạt nhân. Có lẽ ai đó đã làm điều này và có thể giúp tôi? Cảm ơn.

Trả lời

11

Bạn nên tạo một người biết lắng nghe lắng nghe trên kernel.exception sự kiện. Trong onKernelException phương pháp của người nghe rằng bạn có thể kiểm tra ngoại trừ của bạn ví dụ như

Mở lớp nghe ngoại lệ

//namespace declarations 
    class YourExceptionListener 
    { 

     public function onKernelException(GetResponseForExceptionEvent $event) 
     { 
     $exception = $event->getException(); 
     if ($exception instanceof YourException) { 
      //create response, set status code etc. 
      $event->setResponse($response); //event will stop propagating here. Will not call other listeners. 
     } 
     } 
    } 

Tờ khai dịch vụ sẽ là

//services.yml 
kernel.listener.yourlisener: 
    class: FQCN\Of\YourExceptionListener 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
+0

Tôi có thể đặt người nghe vào thư mục gốc của gói của mình không? – vinnylinux

+0

Mặc dù không hoạt động nhưng nó không ghi đè các ngoại lệ. – vinnylinux

+0

Trong trang sơ đồ thanh công cụ của trình gỡ lỗi dev. Chọn tab sự kiện ở bên trái. Bạn sẽ thấy danh sách người nghe. Kiểm tra xem người nghe của bạn có ở đó không. –

1

Bellow là một phần của AppKernel.php của tôi cho việc vô hiệu hóa bắt ngoại lệ nội bởi Symfony cho các yêu cầu JSON, (bạn có thể ghi đè lên handle phương pháp thay vì tạo một giây)

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel { 
    public function init() { 
    parent::init(); 

    if ($this->debug) { 
     // workaround for nasty PHP BUG when E_STRICT errors are reported 
     error_reporting(E_ALL); 
    } 
    } 

    public function handleForJson(Request $request, 
           $type = HttpKernelInterface::MASTER_REQUEST, 
           $catch = true 
) { 
    return parent::handle($request, $type, false); 
    } 
    ... 
+1

này có vẻ là một chút hackish ... bất kỳ cách khác? – vinnylinux

+0

Mở rộng lớp học với OOP convetion là hackish? – sbczk

+0

Không chắc chắn ý của bạn là gì theo "quy ước OOP". Ý tưởng tốt là không ghi đè lên các lớp khung công tác. KernelEvents :: EXCEPTION được ném ngay từ đầu của handleResponse để bạn có thể cắm vào đó bằng cách lắng nghe nó trong trình nghe của riêng bạn thay vì sửa đổi các lớp khung công tác. – smentek