有没有办法从Yii2中的错误消息中隐藏文件系统路径

时间:2016-05-30 04:47:54

标签: yii2 yii-components

生产服务器上有一个应用程序,有时我需要做一些快速修改。但是,Yii2,出现错误时,它会显示错误文件的完整文件系统路径。

我唯一知道并尝试过的事情:

  1. 停止web\index.php中的调试,例如defined('YII_DEBUG') or define('YII_DEBUG', false);

  2. 临时关闭网站,例如that,或公开(通过更改IIS中的绑定)并通过内部循环从服务器上的远程桌面访问它。

  3. 我想知道是否有办法让Yii停止关于文件的完整系统路径,并考虑一些常规路径,例如@app\views\site\index.php而不是C:\www\app\views\site\index.php

1 个答案:

答案 0 :(得分:0)

我发现负责显示错误的方法是renderCallStackItem,可在vendor\yiisoft\yii2\web\ErrorHandler.php中找到。我只是更改了它返回的文件参数,如下所示:

public function renderCallStackItem($file, $line, $class, $method, $args, $index)
    {
        $lines = [];
        $begin = $end = 0;
        if ($file !== null && $line !== null) {
            $line--; // adjust line number from one-based to zero-based
            $lines = @file($file);
            if ($line < 0 || $lines === false || ($lineCount = count($lines)) < $line) {
                return '';
            }

            $half = (int) (($index === 1 ? $this->maxSourceLines : $this->maxTraceSourceLines) / 2);
            $begin = $line - $half > 0 ? $line - $half : 0;
            $end = $line + $half < $lineCount ? $line + $half : $lineCount - 1;
        }

        return $this->renderFile($this->callStackItemView, [
            'file' => str_replace(Yii::$app->basePath, '...',$file), //Change is here
            'line' => $line,
            'class' => $class,
            'method' => $method,
            'index' => $index,
            'lines' => $lines,
            'begin' => $begin,
            'end' => $end,
            'args' => $args,
        ]);
    }

我使用str_replace从错误消息中删除了应用程序的basePath。我通过在框架源中对文件进行硬编码来完成此操作。

enter image description here

现在的问题,我不知道如何覆盖OOP中的方法?即我想创建从ErrorHandler延伸的新vendor\yiisoft\yii2\web\ErrorHandler.php类。 问题是如何才能让Yii2为应用程序更改其ErrorHandler类?

解决方案如下:

1-更改config/web.php \

中的默认ErrorHandler类
'errorHandler' => [
            'errorAction' => 'site/error',
            'class' => 'app\components\saidbakr\FoxErrorHandler',
        ],
  1. 使用以下代码在名为components/saidbakr的{​​{1}}中创建一个新类:
  2. نتامعلخعرؤنلبغفخا

    FoxErrorHandler.php

    上面的类代码只是从ErrorHandler继承而来的,方法<?php namespace app\components\saidbakr; use Yii; class FoxErrorHandler extends \yii\web\ErrorHandler { public function renderCallStackItem($file, $line, $class, $method, $args, $index) { $lines = []; $begin = $end = 0; if ($file !== null && $line !== null) { $line--; // adjust line number from one-based to zero-based $lines = @file($file); if ($line < 0 || $lines === false || ($lineCount = count($lines)) < $line) { return ''; } $half = (int) (($index === 1 ? $this->maxSourceLines : $this->maxTraceSourceLines) / 2); $begin = $line - $half > 0 ? $line - $half : 0; $end = $line + $half < $lineCount ? $line + $half : $lineCount - 1; } return $this->renderFile($this->callStackItemView, [ 'file' => str_replace(Yii::$app->basePath, '...',$file),//Look Here 'line' => $line, 'class' => $class, 'method' => $method, 'index' => $index, 'lines' => $lines, 'begin' => $begin, 'end' => $end, 'args' => $args, ]); } } 是原始代码的副本,对renderCallStackItem值几乎没有任何修改。

    更新

    在某些情况下,错误或调试消息的标头可能包含受影响文件的完整文件系统路径。它是一个名为$file的模板,它在previuosExceptionView类中有一个名为ErrorHandler的属性。我们应该在子错误处理程序类previousExceptionView中覆盖此属性,如下所示:

    FoxErrorHandler

    然后,在... class FoxErrorHandler extends \yii\web\ErrorHandler { public $previousExceptionView = '@app/components/saidbakr/previousException.php'; public function renderCallStackItem($file, $line, $class, $method, $args, $index) { .... 的考虑路径中,我们应该将名为$previousExceptionView的文件从previousException.php复制到该路径,即\vendor\yiisoft\yii2\views\errorHandler,然后我们必须编辑其文件路径输出,文件@app/components/saidbakr/previousException.php应如下所示:

    previousException.php