Blame view

vendor/yiisoft/yii2/web/ErrorAction.php 3.26 KB
abf1649b   andryeyev   Чистая установка ...
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
72
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  <?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) {
              // action has been invoked not from error handler, but by direct route, so we display '404 Not Found'
              $exception = new HttpException(404, Yii::t('yii', 'Page not found.'));
          }
  
          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,
              ]);
          }
      }
  }