You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							2.8 KiB
						
					
					
				<?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, | 
						|
			)); | 
						|
		} | 
						|
	} | 
						|
}
 | 
						|
 |