Để có thể kiểm soát thông báo lỗi, trước tiên tại file application.ini ta phải cấu hình bật các chức năng cảnh báo trong zend framework. Chức năng cảnh này thường sẽ được tắt, vì khi đưa source lên mạng, rõ ràng chúng ta hoàn toàn không muốn khách đọc được hoặc thấy được các vấn đề mà chúng ta gặp phải. Vì điều đó thật mạo hiểm, nếu khách là người am hiểu về hacking.
Tại file application.ini ta bổ sung và chỉnh sửa các tham số như sau:
Mã:
phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
+ Đối với mô hình không module (mô hình mặc định).
Hãy tạo ErrorController.php với nội dung như sau:
PHP Code:
<?phpclass ErrorController extends Zend_Controller_Action{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
if (!$errors || !$errors instanceof ArrayObject) {
$this->view->message = 'You have reached the error page';
return;
}
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setHttpResponseCode(404);
$priority = Zend_Log::NOTICE;
$this->view->message = 'Page not found';
break;
default:
// application error
$this->getResponse()->setHttpResponseCode(500);
$priority = Zend_Log::CRIT;
$this->view->message = 'Application error';
break;
}
// Log exception, if logger available
if ($log = $this->getLog()) {
$log->log($this->view->message, $priority, $errors->exception);
$log->log('Request Parameters', $priority, $errors->request->getParams());
}
// conditionally display exceptions
if ($this->getInvokeArg('displayExceptions') == true) {
$this->view->exception = $errors->exception;
}
$this->view->request = $errors->request;
}
public function getLog()
{
$bootstrap = $this->getInvokeArg('bootstrap');
if (!$bootstrap->hasResource('Log')) {
return false;
}
$log = $bootstrap->getResource('Log');
return $log;
}
}
PHP Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zend Framework Default Application</title>
</head>
<body>
<h1>An error occurred</h1>
<h2><?php echo $this->message ?></h2>
<?php if (isset($this->exception)): ?>
<h3>Exception information:</h3>
<p>
<b>Message:</b> <?php echo $this->exception->getMessage() ?> </p>
<h3>Stack trace:</h3>
<pre><?php echo $this->exception->getTraceAsString() ?> </pre>
<h3>Request Parameters:</h3>
<pre><?php echo $this->escape(var_export($this->request->getParams(), true)) ?> </pre>
<?php endif ?>
</body>
</html>Giả sừ ở đây, tôi tạo IndexController.php, trong IndexController tôi lại tạo indexAction và cố tình không tạo file index.phtml. Khi chạy ứng dụng, nếu chưa cấu hình tôi nhận được thông báo như hình bên dưới. (Khó đọc lỗi)
Nhưng nếu bạn đã cấu hình ErrorController theo hướng dẫn ở trên thì kết quả sẽ hiển thị như hình bên dưới:
Với thông báo ở trên, ta thấy rằng mọi thứ đã rõ ràng hơn nhiều rồi phải không nào. Nó chỉ ra cho ta thấy tại thư mục index ta thiếu file index.phtml. Và dĩ nhiên, điều đó hoàn toàn không khó để khắc phục.
+ Đối với mô hình multi module.
(xem thêm về hướng dẫn cấu hình multi module nếu bạn chưa rõ cách cấu hình)
Hãy tạo một module có tên là error theo cấu trúc như sau:
---------error
---------------controllers
----------------------ErrorController.php
---------------views
----------------------scripts
-----------------------------error
-----------------------------------error.phtml
PHP Code:
<?phpclass Error_ErrorController extends Zend_Controller_Action{
}Sau khi đã hoàn tất công đoạn này, ta cũng cần khai báo cho hệ thống biết. Khi các module khác bị lỗi, thì sẽ gọi module error này ra để thể hiện thông báo lỗi. Để làm được điều này, ta mở file bootstrap.php ở thư mục application và thêm vào 1 phương thức như sau:
PHP Code:
<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
public function _initAutoload(){
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
'module' => 'error',
'controller' => 'error',
'action' => 'error'
)));
}
}Hy vọng, bởi việc sử dụng ErrorController này sẽ ít nhiều giúp cho các bạn giải quyết các vấn đề liên quan đến việc hiển thị lỗi khi mới lần đầu tiếp cận với zend framework.
(Bùi Quốc Huy)
Không có nhận xét nào:
Đăng nhận xét