ErrorAction.php 2.71 KB
Newer Older
Qiang Xue committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
<?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()
 * {
Alexander Makarov committed
26 27 28
 *     return [
 *         'error' => ['class' => 'yii\web\ErrorAction'],
 *     ];
Qiang Xue committed
29 30 31 32 33 34 35 36 37 38 39 40 41
 * }
 * ```
 *
 * 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
Alexander Makarov committed
42
 * 'errorHandler' => [
Qiang Xue committed
43
 *     'errorAction' => 'site/error',
Alexander Makarov committed
44
 * ]
Qiang Xue committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
 * ```
 *
 * @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()
	{
72
		if (($exception = Yii::$app->exception) === null) {
Qiang Xue committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
			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 {
Alexander Makarov committed
99
			return $this->controller->render($this->view ?: $this->id, [
Qiang Xue committed
100 101 102
				'name' => $name,
				'message' => $message,
				'exception' => $exception,
Alexander Makarov committed
103
			]);
Qiang Xue committed
104 105 106
		}
	}
}