Qiang Xue
12 years ago
1 changed files with 108 additions and 0 deletions
@ -0,0 +1,108 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\web; |
||||||
|
|
||||||
|
use Yii; |
||||||
|
use yii\base\Action; |
||||||
|
use yii\base\Exception; |
||||||
|
use yii\base\UserException; |
||||||
|
|
||||||
|
/** |
||||||
|
* ErrorAction displays application errors using a specified view. |
||||||
|
* |
||||||
|
* To use ErrorAction, you need to do the following steps: |
||||||
|
* |
||||||
|
* First, declare an action of ErrorAction type in the `actions()` method of your `SiteController` |
||||||
|
* class (or whatever controller you prefer), like the following: |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* public function actions() |
||||||
|
* { |
||||||
|
* return array( |
||||||
|
* 'error' => array( |
||||||
|
* 'class' => 'yii\web\ErrorAction', |
||||||
|
* ), |
||||||
|
* ); |
||||||
|
* } |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* Then, create a view file for this action. If the route of your error action is `site/error`, then |
||||||
|
* the view file should be `views/site/error.php`. In this view file, the following variables are available: |
||||||
|
* |
||||||
|
* - `$name`: the error name |
||||||
|
* - `$message`: the error message |
||||||
|
* - `$exception`: the exception being handled |
||||||
|
* |
||||||
|
* Finally, configure the "errorHandler" application component as follows, |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* 'errorHandler' => array( |
||||||
|
* 'errorAction' => 'site/error', |
||||||
|
* ) |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* @author Qiang Xue <qiang.xue@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
class ErrorAction extends Action |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @var string the view file to be rendered. If not set, it will take the value of [[id]]. |
||||||
|
* That means, if you name the action as "error" in "SiteController", then the view name |
||||||
|
* would be "error", and the corresponding view file would be "views/site/error.php". |
||||||
|
*/ |
||||||
|
public $view; |
||||||
|
/** |
||||||
|
* @var string the name of the error when the exception name cannot be determined. |
||||||
|
* Defaults to "Error". |
||||||
|
*/ |
||||||
|
public $defaultName; |
||||||
|
/** |
||||||
|
* @var string the message to be displayed when the exception message contains sensitive information. |
||||||
|
* Defaults to "An internal server error occurred.". |
||||||
|
*/ |
||||||
|
public $defaultMessage; |
||||||
|
|
||||||
|
|
||||||
|
public function run() |
||||||
|
{ |
||||||
|
if (!($exception = Yii::$app->getErrorHandler()->exception)) { |
||||||
|
return ''; |
||||||
|
} |
||||||
|
|
||||||
|
if ($exception instanceof HttpException) { |
||||||
|
$code = $exception->statusCode; |
||||||
|
} else { |
||||||
|
$code = $exception->getCode(); |
||||||
|
} |
||||||
|
if ($exception instanceof Exception) { |
||||||
|
$name = $exception->getName(); |
||||||
|
} else { |
||||||
|
$name = $this->defaultName ?: Yii::t('yii', 'Error'); |
||||||
|
} |
||||||
|
if ($code) { |
||||||
|
$name .= " (#$code)"; |
||||||
|
} |
||||||
|
|
||||||
|
if ($exception instanceof UserException) { |
||||||
|
$message = $exception->getMessage(); |
||||||
|
} else { |
||||||
|
$message = $this->defaultMessage ?: Yii::t('yii', 'An internal server error occurred.'); |
||||||
|
} |
||||||
|
|
||||||
|
if (Yii::$app->getRequest()->getIsAjax()) { |
||||||
|
return "$name: $message"; |
||||||
|
} else { |
||||||
|
return $this->controller->render($this->view ?: $this->id, array( |
||||||
|
'name' => $name, |
||||||
|
'message' => $message, |
||||||
|
'exception' => $exception, |
||||||
|
)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue