无论如何都要一起禁用laravel错误处理程序?
我想简单地显示标准PHP错误,不 Whoops, looks like something went wrong
错误。
答案 0 :(得分:35)
并非没有严重违反框架原则(如果您仍然感兴趣,我会告诉您下面的操作方法)。
有一些事情使这很难实现。很容易取消设置默认错误和异常处理程序
set_error_handler(null);
set_exception_handler(null);
但这会给你留下两个主要障碍。
第一个是Laravel注册一个关闭处理程序作为其自举的一部分,这个关闭函数将查找最后一个错误,如果这是致命错误,请手动调用异常处理代码。有no easy way to un-register a shutdown function。
第二个是,主要的Laravel Application处理程序看起来像这个
#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版本可能会有所不同。
如果handle
方法在未来版本的Laravel中发生变化,则会中断。
如果自定义程序包依赖于添加自定义异常处理程序,它们可能会中断。
除了临时调试技术之外,我建议远离这个。
答案 1 :(得分:10)
然后设置' debug' =>错误,位于 \ config \ local \ app.php 文件
中<?php
return array(
'debug' => false,
);
答案 2 :(得分:5)
在laravel 5中禁用调试,你只需要发表评论
//'debug' => env('APP_DEBUG'),
\ config \ app.php文件中的
答案 3 :(得分:2)
异常处理被硬编码到Application
类中。您可以覆盖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;
不言而喻,绝对不鼓励这样做。
答案 4 :(得分:0)
有关问题:Laravel有一个内置的方法来禁用单元测试中的异常:
$this->withoutExceptionHandling()
关于该主题的广播:https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/17
答案 5 :(得分:-1)
这会让你走近。可能有更合适的方法来做到这一点。它用单方法类替换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');
});
答案 6 :(得分:-2)
在档案.env
中,只需更改:
APP_DEBUG=true
要:
APP_DEBUG=false