mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 06:37:55 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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 [
 | 
						|
 *         'error' => ['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' => [
 | 
						|
 *     '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;
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Runs the action
 | 
						|
     *
 | 
						|
     * @return string result content
 | 
						|
     */
 | 
						|
    public function run()
 | 
						|
    {
 | 
						|
        if (($exception = Yii::$app->getErrorHandler()->exception) === null) {
 | 
						|
            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, [
 | 
						|
                'name' => $name,
 | 
						|
                'message' => $message,
 | 
						|
                'exception' => $exception,
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |