禁用laravel错误处理程序

时间:2014-08-22 02:03:02

标签: php laravel error-handling laravel-4

无论如何都要一起禁用laravel错误处理程序?

我想简单地显示标准PHP错误 Whoops, looks like something went wrong错误。

7 个答案:

答案 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