2010-10-10 8 views

Antwort

26

Savant vom IRC hat mir geholfen, und er sich mit der beforeRender(){} im app_controller vorschlagen

// Before Render 
function beforeRender() { 
    if($this->name == 'CakeError') { 
     //$this->layout = 'error'; 
    } 
} 

CakeError ein catchAll für Fehler ist: D

+0

Diese Methode ist nicht mehr gültig mit CakePHP 2.x. Und ich habe keine Ahnung, wie es jetzt geht ... lol –

+3

Ich kann bestätigen, dass diese Methode mit Cake 2.2.1 funktioniert. – bancer

+0

Ich bestätige nicht in Kuchen 2.2.1. Ich debugge $ this-> Layout in BeforeRender, ich bekomme das erwartete 'public_layout', aber es wird immer noch in default.ctp gerendert. DEBUG ist auf 0 gesetzt. –

4

Diese einfachste Weise, die ich kenne, ist diese Funktion in Ihrem AppController zu erstellen:

function appError($method, $messages) 
{ 
} 

Anschließend können Sie, was Sie mit dem Fehler wollen tun, zeigen Sie es wie Sie wollen, oder es gar nicht angezeigt, sende eine E-Mail usw. (Ich bin mir nicht sicher, ob diese Methode noch gültig ist.)

Es gibt auch eine Option zum Erstellen app_error.php in Ihrer App root, mit class AppError extends ErrorHandler darin, die Sie alle Arten von überschreiben können Fehler. Aber ich habe das noch nicht gemacht, also kann ich dir nicht mehr darüber erzählen.

Weitere Informationen finden Sie unter cake/libs/error.php und cake/libs/object.php und natürlich The Book.

Bearbeiten: Vergessen zu erwähnen, wenn Sie den Fehler erfasst haben, gibt es nichts, was Sie daran hindert, beispielsweise den Fehler in der Sitzung zu speichern, zu Ihrem "Fehlerbehandlungscontroller" umzuleiten und ihn dann in Ihrem Controller anzuzeigen Sie wollen.

+0

vielen Dank: D –

10

besser eine error.php Datei in Ihrer Anwendung zu erstellen

Ordner
class AppError extends ErrorHandler { 
    function error404($params) { 
      $this->controller->layout = 'error'; 
      parent::error404($params); 
    } 
} 

so können Sie die if-Tests auf jeder Seite vermeiden machen, dass Savants' Lösung führt

14

In 2.2.2 CakePHP änderte ich den ExceptionRenderer in core.php mit meinem eigenen, wie folgt aus:

app/Config/core.php:

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException', 
    'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default 
    'log' => true 
)); 

app/Lib/Error/MyExceptionRenderer. php:

App::uses('ExceptionRenderer', 'Error'); 

class MyExceptionRenderer extends ExceptionRenderer { 

    protected function _outputMessage($template) { 
    $this->controller->layout = 'error'; 
    parent::_outputMessage($template); 
    } 

} 
+0

Kann nicht genug hoch, schlägt meinen alten Ansatz des Duplizierens jeder Fehleransicht und das Festlegen des Layouts auf "Fehler" an der Spitze. – Matthew

4

Meine Lösung für CakePHP 2,3

Änderung t Der ExceptionRenderer in der core.php verwendet einen eigenen Renderer.

app/Config/core.php:

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException', 
    'renderer' => 'MyExceptionRenderer', 
    'log' => true 
)); 

app/Lib/Error/MyExceptionRenderer.php:

App::uses('ExceptionRenderer', 'Error'); 

class MyExceptionRenderer extends ExceptionRenderer 
{ 
    /** 
    * Overrided, to always use a bare controller. 
    * 
    * @param Exception $exception The exception to get a controller for. 
    * @return Controller 
    */ 
    protected function _getController($exception) { 
     if (!$request = Router::getRequest(true)) { 
      $request = new CakeRequest(); 
     } 
     $response = new CakeResponse(array('charset' => Configure::read('App.encoding'))); 
     $controller = new Controller($request, $response); 
     $controller->viewPath = 'Errors'; 
     $controller->layout = 'error'; 
     return $controller; 
    } 
} 

Der Vorteil dieses Ansatzes besteht darin, dass es keine Ausnahmen von AppController geworfen wird sichergestellt, verursachen keine Endlosschleife beim Rendern der Ausnahme. Erzwingt jedes Mal ein grundlegendes Rendering der Ausnahmebedingungsnachricht.

9

Sie müssen nur Layoutänderungen in Ihrer error400.ctp Datei unter/app/View/Errors/error400 vornehmen.ctp

öffnen, die Datei und legen Sie das Layout von

<?php $this->layout=''; //set your layout here ?> 
+0

+1 für eine sehr einfache Lösung. Funktioniert gut und braucht fast keine Mühe! (CakePHP 2.4.7) – Hatcham

+0

Dies ist die richtige Lösung. Vielen Dank – Alireza

Verwandte Themen