2012-11-20 49 views
1

每當我收到像Fatal error: Call to a member function getName() on a non-object in /var/www/...Controller.php on line 143這樣的錯誤時,我的symfony2-app在prod-environment中顯示一個空白頁面。上述消息可在開發環境中使用。我想在產品環境中顯示這樣的錯誤的自定義頁面。我如何在Symfony2中實現它?用戶友好的Symfony2中的錯誤頁面

更新: 5月kernel.event_listener幫助我?

+0

您可以創建一個[錯誤控制器](http://symfony.com/doc/2.0/cookbook/controller/error_pages.html) –

+0

爲什麼你想這樣做?在應用程序崩潰的生產環境中向用戶展示這種安全風險?因此,您只能在開發模式下看到它 –

+0

@RezaSanaie現在它顯示一個空白頁面。我想顯示一些消息,如「出錯了,稍後再試」。 –

回答

5

你不能在symfony中真正實現它。致命錯誤不是由symfony處理,而是由PHP擴展本身處理。 Symfony代碼從來沒有得到完成執行的機會,因爲致命的錯誤讓PHP通過自己的設備來處理錯誤。 PHP錯誤處理由error_reporting()set_error_handler()設置的error_handler設置。在開發環境中,php error reporting設置爲E_ALL以顯示所有錯誤。在生產環境中,錯誤和調試消息設置爲0,並且出於審美和安全原因而不顯示(某些錯誤消息可能顯示密碼等)。最好的建議是在部署到生產之前修復所有致命錯誤。捕獲並顯示致命錯誤的自定義頁面必須使用php設置錯誤處理完成 - http://php.net/manual/en/function.set-error-handler.php

對於非致命錯誤,您可以創建一個可顯示自定義錯誤頁視圖 - http://symfony.com/doc/2.0/cookbook/controller/error_pages.html

1

我做這種方式:

 

class ErrorExceptionHandler { 

    function __construct() { 
     register_shutdown_function(array($this, 'fatalErrorHandler')); 
    } 

    function fatalErrorHandler() { 
     $error = error_get_last(); 
     if ($error['type'] === E_ERROR) { 
      header('Location: /error-page-url'); 
     } 
    } 

} 

ErrorExceptionHandler(); // add to app.php 

當然請記住命名空間等