2011-08-16 26 views
5

tôi đã cố gắng sử dụng đặc biệt biến $message mô tả ở đây http://www.symfony-project.org/cookbook/1_2/en/error_templates nhưng có vẻ như biến này không được định nghĩa trong symfony 1.4, ít nhất là nó không chứa thông điệp truyền cho ngoại lệ theo cách này throw new sfException('some message')symfony 1.4: Làm cách nào để truyền thông điệp ngoại lệ tới error.html.php?

Bạn có biết cách nào khác để chuyển thông tin này tin nhắn đến error.html.php?

Trả lời

7

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

+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

+0

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

+1

@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

0

Tôi đã tìm thấy một mẹo khác để làm điều đó - sfContext có thể được sử dụng để chuyển thông điệp ngoại lệ sang error.html.php nhưng chức năng tùy chỉnh phải được sử dụng để ném ngoại lệ. Ví dụ:

class myToolkit { 
    public static function throwException($message) 
    { 
     sfContext::getInstance()->set('error_msg', $message); 
     throw new sfException($message); 
    } 

hơn insted của việc sử dụng throw new sfException('some message') bạn nên sử dụng myToolkit::throwException('some message')

Để hiển thị thông điệp trong error.html.php sử dụng <?php echo sfContext::getInstance()->get('error_msg') ?>

1

Tôi nghĩ rằng tôi đã tìm thấy một câu trả lời đơn giản hơn nhiều. Trên Symfony 1.4 $message thực sự không được xác định, nhưng $exception là (nó chứa đối tượng ngoại lệ).

Vì vậy, chỉ cần echo $exception->message.

Et voilà!

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