Bạn cần thực hiện một số thao tác xử lý lỗi tùy chỉnh. Chúng tôi đã thực hiện một hành động symfony tùy chỉnh. Tuy nhiên, hãy thận trọng, bản thân hành động này cũng có thể kích hoạt một ngoại lệ, bạn cần tính đến điều đó.
Sau đây có thể là một khởi đầu tốt. Đầu tiên thêm một người biết lắng nghe cho sự kiện này, một nơi tốt sẽ ProjectConfiguration.class.php:
$this->dispatcher->connect('application.throw_exception', array('MyClass', 'handleException'));
Sử dụng xử lý sự kiện có thể đủ cho những gì bạn muốn làm gì với ngoại lệ, ví dụ nếu bạn chỉ muốn thư một dấu vết ngăn xếp cho quản trị viên. Chúng tôi muốn chuyển tiếp đến một hành động tùy chỉnh để hiển thị và xử lý biểu mẫu phản hồi. xử lý sự kiện của chúng tôi nhìn một cái gì đó như thế này:
class MyClass {
public static function handleException(sfEvent $event) {
$moduleName = sfConfig::get('sf_error_500_module', 'error');
$actionName = sfConfig::get('sf_error_500_action', 'error500');
sfContext::getInstance()->getRequest()->addRequestParameters(array('exception' => $event->getSubject()));
$event->setReturnValue(true);
sfContext::getInstance()->getController()->forward($moduleName, $actionName);
}
}
Bây giờ bạn có thể cấu hình các module và hành động để chuyển tiếp để vào một ngoại lệ trong settings.yml
all:
.actions:
error_500_module: error
error_500_action: error500
Trong hành động riêng của mình bây giờ bạn có thể làm bất cứ điều gì bạn muốn với ngoại lệ, ví dụ như. hiển thị biểu mẫu phản hồi để liên hệ với quản trị viên. Bạn có thể nhận được ngoại lệ bằng cách sử dụng $ request-> getParameter ('exception')
+1 Cảm ơn bạn rất nhiều! Hệ thống của chúng tôi hỗ trợ theming và không có điều này, chúng tôi sẽ không thể hỗ trợ theming lỗi 500 trang quá. Nhiều đánh giá cao. – flu
Cảm ơn câu trả lời của bạn! Việc kết nối chức năng tùy chỉnh của bạn với 'application.throw_exception' * có ghi đè lên hành vi mặc định của symfony trên sự kiện đó không? Nếu có, tôi có thể ngăn chặn nó bằng cách gọi 'self :: parent()' bên trong hàm tùy chỉnh không? Tôi chỉ muốn * thêm * một số chức năng .. – Tapper
@Tapper bạn sẽ có thể thực hiện điều đó bằng cách sửa đổi giá trị trả về, hãy thử $ event-> setReturnValue (false) thay thế – Gerry