不是没有严重违反框架的原则(我会告诉你如何做下面的,如果你仍然有兴趣)。
有一些事情使得难以完成。很容易解决默认错误和异常处理程序
set_error_handler(null);
set_exception_handler(null);
但是这会给你带来两大障碍。
第一个是Laravel注册一个关机处理程序作为其引导的一部分,这个关闭功能将查找最后一个错误,如果是一个致命的错误,手动调用异常处理代码。有no easy way to un-register a shutdown function。
第二个是,主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的显示错误ini设置为1.这样可以确保错误输出到浏览器。
接下来,我们正在定义一个扩展真实应用程序类的新应用程序类。
最后,我们用我们的类实例化的对象来替换真正的Laravel $ app对象。
在我们的应用程序类本身,我们空白startExceptionHandling。这样可以防止Laravel设置自定义异常,错误和关闭回调。我们还定义了从try / catch中删除应用程序启动/调度的句柄。这是该过程中最脆弱的部分,根据您的Laravel版本可能会有所不同。
最终警告
如果手柄方法在未来的版本Laravel中发生变化,这将会破裂。
如果自定义包依赖于添加自定义异常处理程序,它们可能会中断。
我建议远离这一切,除了临时调试技术之外。