Php 禁用laravel错误处理程序
是否有必要一起禁用laravel错误处理程序Php 禁用laravel错误处理程序,php,laravel,error-handling,laravel-4,Php,Laravel,Error Handling,Laravel 4,是否有必要一起禁用laravel错误处理程序 我只想显示标准PHP错误,不,哎呀,好像出了什么问题。错误。这会让你接近。也许有一种更合适的方法。它用一个方法类替换了Laravel当前的异常处理程序。除了下面的基本路线之外,我还没有测试过这个,所以您可能需要添加其他方法来满足不同的情况 class ExceptionHandler { public function handleException($e) { echo $e; die; }
我只想显示标准PHP错误,不,
哎呀,好像出了什么问题。
错误。这会让你接近。也许有一种更合适的方法。它用一个方法类替换了Laravel当前的异常处理程序。除了下面的基本路线之外,我还没有测试过这个,所以您可能需要添加其他方法来满足不同的情况
class ExceptionHandler
{
public function handleException($e)
{
echo $e;
die;
}
}
App::bind('exception', App::share(function($app)
{
return new ExceptionHandler;
}));
Route::get('/', function()
{
throw new Exception('Testing');
});
除非严重违反框架的原则(如果您仍然感兴趣,我将在下面告诉您如何做) 有几件事使得这件事很难完成。取消设置默认错误和异常处理程序非常简单
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的显示错误ini设置为1
。这样可以确保将错误输出到浏览器
接下来,我们将定义一个扩展实际应用程序类的新应用程序类
最后,我们用类实例化的对象替换真正的Laravel$app
对象
在应用程序类本身中,我们将startExceptionHandling
清空。这可以防止Laravel设置自定义异常、错误和关闭回调。我们还定义了handle
,以从try/catch中删除应用程序启动/调度。这是过程中最脆弱的部分,根据您的Laravel版本的不同,看起来可能会有所不同
最后警告
如果在未来版本的Laravel中更改了句柄
方法,则此操作将中断
如果自定义包依赖于添加自定义异常处理程序,则它们可能会中断
我建议不要使用这种方法,因为它不是一种临时调试技术。异常处理是硬编码到
应用程序
类中的。您可以覆盖bootstrap/start.php
文件中的类:
class ExceptionHandler {
public function handleException($exception) {
throw $exception;
}
public function handleConsole($exception) {
throw $exception;
}
}
class MyApplication extends Illuminate\Foundation\Application
{
public function registerExceptionProvider() {}
public function startExceptionHandling() {}
}
$app = new MyApplication;
不用说,这是绝对不鼓励的。然后在\config\local\app.php文件中设置'debug'=>false
<?php
return array(
'debug' => false,
);
在laravel 5中要禁用调试,只需注释即可
//'debug' => env('APP_DEBUG'),
在\config\app.php文件中在文件
.env
中,只需更改:
APP_DEBUG=true
致:
与问题相关:Laravel有一个内置的方法来禁用单元测试中的异常:
$this->withoutExceptionHandling()
Laracast关于这个主题:你一点细节都没有吗?Laravel使用“呜呜”库作为错误处理程序,因此您应该可以看到有用的跟踪。演示:@Scopey不,这就是我得到的,但我不想这样。2019年,你的问题同时意味着两个不同的答案。1) 要在PHPUnit测试(位于
app/Exceptions/handler.php
)中禁用Laravel错误处理程序,必须使用$this->withoutExceptionHandling()
(请参阅)。2) 要获得有意义的错误和堆栈跟踪,而不是Whoops…
外部测试,只需将APP_DEBUG=true
放入.env
文件。这不是我真正想要的,因为它不会像标准PHP那样打印。或者,执行'DEBUG'=>false、
或。。。更改.env文件中的属性,就像它打算被使用一样?为什么要进行向下投票?这将按照要求给出所需的结果。我要补充的是,当从Laravel的PHPUnit测试调用此方法时,该方法是有效的。
APP_DEBUG=false