2010-10-10 26 views

Trả lời

26

Savant từ IRC giúp tôi ra ngoài và ông đề nghị trong việc sử dụng beforeRender(){} trong app_controller

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

CakeError là một catchall cho các lỗi: D

+0

Phương pháp này không còn giá trị với CakePHP 2.x. Và tôi không có ý tưởng làm thế nào để làm điều đó ngay bây giờ ... lol –

+3

Tôi có thể xác nhận rằng phương pháp này hoạt động với Bánh 2.2.1. – bancer

+0

Tôi không xác nhận trong Bánh 2.2.1. Tôi gỡ lỗi $ this-> layout bên trong beforeRender, tôi nhận được 'public_layout' dự kiến, nhưng nó vẫn được hiển thị trong default.ctp. DEBUG được đặt thành 0. –

4

này cách đơn giản nhất tôi biết là để tạo ra chức năng này trong AppController của bạn:

function appError($method, $messages) 
{ 
} 

Sau đó bạn có thể làm bất cứ điều gì bạn muốn với các lỗi, hiển thị nó tuy nhiên bạn muốn, hoặc không hiển thị nó ở tất cả, gửi email, v.v. (Tôi không chắc liệu phương pháp này có còn hợp lệ không.)

Ngoài ra còn có tùy chọn tạo app_error.php trong thư mục ứng dụng của bạn, với class AppError extends ErrorHandler trong đó, cho phép bạn ghi đè tất cả các loại lỗi. Nhưng tôi chưa làm điều này, vì vậy tôi không thể nói thêm về nó.

Xem cake/libs/error.phpcake/libs/object.php và dĩ nhiên The Book để biết thêm thông tin.

Chỉnh sửa: Quên đề cập đến, khi bạn gặp lỗi, không có gì ngăn cản bạn - ví dụ - lưu lỗi trong phiên, chuyển hướng đến "bộ điều khiển xử lý lỗi", và sau đó hiển thị nó trong bộ điều khiển của bạn bạn muốn.

+0

thanks a lot: D –

10

tốt hơn để tạo ra một tập tin error.php trong ứng dụng của bạn thư mục

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

vì vậy bạn có thể tránh được nếu thử nghiệm tại trang EVERY và việc này là giải pháp bác học giới thiệu

14

Trong CakePHP 2.2.2 Tôi đã thay đổi ExceptionRenderer trong core.php với riêng tôi, như thế này:

app/config/core.php:

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

app/Lib/Lỗi/MyExceptionRenderer. php:

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

class MyExceptionRenderer extends ExceptionRenderer { 

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

} 
+0

Không thể nâng cấp đủ điều này, đánh bại cách tiếp cận cũ của tôi khi sao chép từng chế độ xem lỗi và đặt bố cục thành 'lỗi' ở trên cùng. – Matthew

4

giải pháp của tôi cho CakePHP 2,3

Thay đổi t ông ExceptionRenderer trong core.php để sử dụng trình kết xuất của riêng bạn.

app/config/core.php:

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

app/Lib/Lỗi/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; 
    } 
} 

Ưu điểm của phương pháp này là nó đảm bảo bất kỳ trường hợp ngoại lệ ném từ AppController không gây ra vòng lặp vô tận khi hiển thị ngoại lệ. Buộc hiển thị cơ bản thông báo ngoại lệ mỗi lần.

9

Chỉ cần bạn thực hiện thay đổi bố cục trong tệp error400.ctp của bạn trong/app/View/Errors/error400.ctp

mở tập tin đó và thiết lập bố trí bởi

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

+1 cho một giải pháp rất đơn giản. Làm việc một điều trị và mất gần như không có nỗ lực nào cả! (CakePHP 2.4.7) – Hatcham

+0

Đây là giải pháp đúng. cảm ơn – Alireza

Các vấn đề liên quan