Zend Framework - ErrorController

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”


  1. No Comments

Leave a Reply

PodglÄ…d komentarza:




About me:

  • PHP programmer
  • Symfony developer
  • Zend framework developer

Categories: