这会严重违反框架的原则(如果您仍然感兴趣,我将在下面告诉您如何做)。
有一些事情使得这一目标难以实现。取消设置默认错误和异常处理程序很容易
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 会在这里捕获它并手动调用异常的handleException
方法(触发标准 Laravel 异常处理)。没有办法让 PHP 处理应用程序中发生的致命异常,Laravel 会阻止这种情况发生。
我告诉你如何做你想做的部分
所有这些意味着我们需要用我们自己的应用程序替换主要的 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 显示错误设置为1
。这可确保将错误输出到浏览器。
接下来,我们定义一个新的应用程序类来扩展实际应用程序类。
最后我们替换掉真正的Laravel$app
对象与我们的类实例化的对象。
在我们的应用程序类本身中,我们空白startExceptionHandling
。这可以防止 Laravel 设置自定义异常、错误和关闭回调。我们还定义handle
从 try/catch 中删除应用程序引导/调度。这是该过程中最脆弱的部分,并且可能看起来有所不同,具体取决于您的 Laravel 版本。
最后警告
If the handle
Laravel 未来版本中的方法更改将打破这一点。
如果自定义包依赖于添加自定义异常处理程序,它们可能会崩溃。
我建议远离这种方法,而不是临时调试技术。