生产服务器上有一个应用程序,有时我需要做一些快速修改。但是,Yii2,出现错误时,它会显示错误文件的完整文件系统路径。
我唯一知道并尝试过的事情:
停止web\index.php
中的调试,例如defined('YII_DEBUG') or
define('YII_DEBUG', false);
临时关闭网站,例如that,或公开(通过更改IIS中的绑定)并通过内部循环从服务器上的远程桌面访问它。
我想知道是否有办法让Yii停止关于文件的完整系统路径,并考虑一些常规路径,例如@app\views\site\index.php
而不是C:\www\app\views\site\index.php
答案 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。我通过在框架源中对文件进行硬编码来完成此操作。
现在的问题,我不知道如何覆盖OOP中的方法?即我想创建从ErrorHandler
延伸的新vendor\yiisoft\yii2\web\ErrorHandler.php
类。 问题是如何才能让Yii2为应用程序更改其ErrorHandler类?
解决方案如下:
1-更改config/web.php
\
'errorHandler' => [
'errorAction' => 'site/error',
'class' => 'app\components\saidbakr\FoxErrorHandler',
],
components/saidbakr
的{{1}}中创建一个新类:نتامعلخعرؤنلبغفخا
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