Opis
Artykuł zaprezentuje jak dodać obsługę wyjątków serwera: 404 czyli page not found oraz 500 błąd aplikacji.
UWAGA przykład działa w oparciu o Smarty i nie zadziała prawidłowo na domyślnych ustawieniach Zenda.
Implementacja
Przedewszystkim musimy stworzyć plik kontrolera, który będzie odpowiedzialny za rozróżnienie błędu strony. Domyślnie Zend Controller Action obsługuje błędy i wyjątki za pośrednictem ErrorController'a. Należy pamiętać, aby zmienić nazwę klasy po "extends" na własną (jeśli posiadamy własny fron kontroller bądź na domyślną czyli: Zend_Controller_Action.
Listing 1.0 pokazuje kod dla ErrorControllera który powinien być w katalogu application/controllers
Następnie tworzymy view o nazwie error.tpl w folderze: application/views/error/ aby wyświetlić kod HTML (listing 2.0).
Kolejnym krokiem jest zmodyfikowanie pliku layout.tpl, który jest odpalany za każdym razem przez front kontrolera. Następuje tutaj instrukcja warunkowa, która sprawdza czy jakiś wyjątek został wyłapany (listing 3.0)
Ostatnią rzeczą jaką nam zstała to modyfikacja BOOTSTRAPA (czyli index.php w public), wystarcczy dodać linie do wyświetlania wyjątków (listing 4.0)
Listing
<?php
class ErrorController extends User_Controller_Action {
function init() {
parent::init();
$this->view->baseUrl = $this->_request->getBaseUrl();
}
public function errorAction() {
$errors = $this->_getParam('error_handler');
switch($errors->type) {
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);
$this->view->message = 'Page not found';
break;
default:
//app error
$this->getResponse()->setHttpResponseCode(500);
$this->view->message = 'Application error';
break;
}
$this->view->exception = $errors->exception;
$this->view->request = $errors->request;
}
}
//listing 2.0
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Error</title>
<link rel="stylesheet" type="text/css" media="screen"
href="{$baseUrl}/public/styles/styles.css" />
</head>
<body>
<div class="page">
<h1>An error occurred</h1>
<h2>{$message}</h2>
<br />
<p>
<b>Message:</b> {$exception->getMessage()}
</p>
<br /><br />
<h3>Stack trace:</h3>
<pre>{$exception->getTraceAsString()}</pre>
<br /><br />
<h3>Request parameters:</h3>
<pre>{$request->getParams()|var_dump}</pre>
</div>
</body>
</html>
//listing 3.0
{if $exception}
>>Tutaj nasz content dla błędów 404 i 500
{$layout->content}
{else}
>>Tutaj nasz content dla normalnych stron
{$layout->content}
{/if}
//listing 4.0
$frontController->throwExceptions(false);
Ranga: Administrator serwisu Punktów: 0