Są różne sposoby przechwytywania błędów i zwracania odpowiednich wiadomości do użytkownika. Ten jest krótki, całkiem skuteczny i dość elastyczny. Oczywiście możemy dowolnie zmieniać style widoku, komunikaty zwracane przez ErrorController oraz ich format.
Wykorzystując wcześniej utworzoną strukturę katalogów i nasz Core_Controller_Action, dodajemy w katalogu modules/default/controllers plik ErrorController.php :
<?php
class ErrorController extends Core_Controller_Action
{
public function errorAction()
{
$e = $this->getResponse()->getException();
$this->getResponse()->clearBody();
$message = ($e[0] instanceof Exception)
? $e[0]->getMessage()
: 'Nieznany wyjatek';
$this->view->message = $message;
$errorLayout = $this->_request->getParam('errorLayout');
$this->layout->setLayoutPath(getcwd() . '/application/modules/' . $errorLayout .'/views/');
}
}
?>
Poniższy kod pewnym dodatkiem. Według założeń naszej struktury modułowej i odrębnych layoutów dla modułów, umieszczony w module default ErrorController będzie zawsze zwracał błędy do domyślnego Layoutu. Oznacza to, że np: błędy z admina czy też bloga wyświetliłby się w szablonie strony głównej. Aby temu zapobiec należy dodać do pliku config.ini, dla każdego modułu wpis z informacją z jakiego modułu ma pobierać layout w przypadku błędu. Daje nam to swobodę konfiguracji - jeśli chcemy, to błędy z wszystkich modułów mogą byś wyświetlane w jednym szablonie, jeśli nie - możemy to dowolnie zmienić.
default.defaults.errorLayout = "default"
admin.defaults.errorLayout = "admin" ;w przypadku błędów Layout z admina
blog.defaults.errorLayout = "default" ;w przypadku błędów Layout domyślny
Odpowiada za to poniższy fragment:
<?php
$errorLayout = $this->_request->getParam('errorLayout');
$this->layout->setLayoutPath(getcwd() . '/application/modules/' . $errorLayout .'/views/');
?>
Czyścimy widok (musimy być pewni, że nasz Layout nie zostanie wygenerowany w innym Layoucie), ustawiamy nowy Layout i renderujemy widok.
Przykładowy widok dla akcji zwróconej przez errorAction ErrorControllera. Plik error.tpl umieszczamy w katalogu modules/default/views/error/ :
<div class="error">
{$message}<br />
</div>
Należy jednak pamiętać, by końcowe raportowanie błędów było znacznie bardziej przyjazne użytkownikowi.
Dodatkowo możemy logować błędy do pliku (bardzo uproszczony przykład z domyślnym priorytetem błędów ustawiony na 3 dla wszystkich błędów):
<?php
$log = new Zend_Log(
new Zend_Log_Writer_Stream('/ścieżka/do/logów/logs' )
);
$log->log(
$e[0]->getMessage() . PHP_EOL . $e[o]->getTraceAsString(), Zend_Log::ERR
);
?>
0 Responses to “Zend Framework - ErrorController”
Leave a Reply