禁用laravel错误处理程序

Pet*_*tah 25 php error-handling laravel laravel-4

反正是否一起禁用laravel错误处理程序?

我想简单的显示标准的PHP错误,没有Whoops, looks like something went wrong错误.

Ala*_*orm 39

并非没有严重违反框架的原则(如果您仍然感兴趣,我会告诉您下面该怎么做).

有一些事情使这很难实现.很容易取消设置默认错误和异常处理程序

set_error_handler(null);
set_exception_handler(null);
Run Code Online (Sandbox Code Playgroud)

但这给你留下了两个主要障碍.

第一个是Laravel注册一个关闭处理程序作为其引导的一部分,这个关闭函数将查找最后一个错误,如果这是致命错误,请手动调用异常处理代码.有没有简单的方法来注销关机功能.

第二个是,主要的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说 - 如果您的应用程序代码抛出异常,Laravel会在此处捕获它并手动调用异常的handleException方法(触发标准的Laravel异常处理).没有办法让PHP处理你的应用程序中发生的致命异常,Laravel会阻止它发生.

我告诉你如何做你想要的部分

所有这些意味着我们需要用自己的Laravel主应用程序替换它.在bootstrap/start.php,有以下行

#File: bootstrap/start.php
$app = new Illuminate\Foundation\Application;
Run Code Online (Sandbox Code Playgroud)

用以下内容替换它

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;
Run Code Online (Sandbox Code Playgroud)

我们要做的第一件事就是将PHP的显示错误设置为1.这样可以确保将错误输出到浏览器.

接下来,我们将定义一个扩展实际应用程序类的新应用程序类.

最后,我们用$app我们类实例化的对象替换真正的Laravel 对象.

在我们的应用程序类本身,我们空白startExceptionHandling.这可以防止Laravel设置自定义异常,错误和关闭回调.我们还定义handle从try/catch中删除应用程序启动/分派.这是该过程中最脆弱的部分,根据您的Laravel版本可能会有所不同.

最后的警告

如果该handle方法在未来版本的Laravel中发生变化,则会中断.

如果自定义包依赖于添加自定义异常处理程序,它们可能会中断.

除了临时调试技术之外,我建议远离这个.


Kom*_*mal 10

然后在\ config\local\app.php文件中设置'debug'=> false

<?php

return array(

    'debug' => false,

);
Run Code Online (Sandbox Code Playgroud)


ren*_*dra 5

在laravel 5中禁用调试,您只需要发表评论

//'debug' => env('APP_DEBUG'),
Run Code Online (Sandbox Code Playgroud)

在\ config\app.php文件中

  • 或者...更改 .env 文件中的属性,就像它打算使用的那样? (4认同)