禁用Laravel的内置错误处理方法
是否无论如何都可以一起禁用Laravel错误处理程序?
我想简单地显示标准的PHP错误,而不是错误。Whoops, looks like something went wrong
是否无论如何都可以一起禁用Laravel错误处理程序?
我想简单地显示标准的PHP错误,而不是错误。Whoops, looks like something went wrong
并非没有严重违反框架的原则(如果您仍然感兴趣,我将在下面告诉您如何操作)。
有几件事使这很难完成。取消设置默认错误和异常处理程序非常简单
set_error_handler(null);
set_exception_handler(null);
但这给你留下了两个主要障碍。
第一个是 Laravel 注册一个关闭处理程序作为其引导的一部分,此关闭函数将查找最后一个错误,如果它是致命错误,请手动调用异常处理代码。取消注册关机功能并不容易。
第二个是,主要的Laravel应用程序处理程序看起来像这样
#File: vendor/laravel/framework/src/Illuminate/Foundation/Application.php
public function handle(SymfonyRequest $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
try
{
$this->refreshRequest($request = Request::createFromBase($request));
$this->boot();
return $this->dispatch($request);
}
catch (\Exception $e)
{
if ($this->runningUnitTests()) throw $e;
return $this['exception']->handleException($e);
}
}
也就是说,如果应用程序代码引发异常,Laravel 会在此处捕获它并手动调用异常的方法(这会触发标准的 Laravel 异常处理)。没有办法让PHP处理应用程序中发生的致命异常,Laravel阻止了这种情况的发生。handleException
所有这些都意味着我们需要用我们自己的应用程序替换主要的Laravel应用程序。在 中,有以下行bootstrap/start.php
#File: bootstrap/start.php
$app = new Illuminate\Foundation\Application;
将其替换为以下内容
ini_set('display_errors','1');
class MyApplication extends Illuminate\Foundation\Application
{
function startExceptionHandling()
{
//do nothing
}
public function handle(Symfony\Component\HttpFoundation\Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
$this->refreshRequest($request = Request::createFromBase($request));
$this->boot();
return $this->dispatch($request);
}
}
$app = new MyApplication;
我们要做的第一件事是将 PHP 的显示错误 ini 设置为 。这可确保将错误输出到浏览器。1
接下来,我们将定义一个新的应用程序类,用于扩展实际的应用程序类。
最后,我们将真正的Laravel对象替换为由我们的类实例化的对象。$app
在我们的应用程序类本身中,我们清空了。这可以防止 Laravel 设置自定义异常、错误和关机回调。我们还定义了从 try/catch 中删除应用程序启动/调度。这是该过程中最脆弱的部分,根据您的Laravel版本,可能会有所不同。startExceptionHandling
handle
如果方法在Laravel的未来版本中发生变化,这将中断。handle
如果自定义包依赖于添加自定义异常处理程序,则它们可能会中断。
我建议远离这一点,除了临时调试技术之外。
然后在 \config\local\app 中设置 'debug' => false.php
<?php
return array(
'debug' => false,
);