Php 禁用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; }

是否有必要一起禁用laravel错误处理程序


我只想显示标准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