Отключить обработчик ошибок laravel

есть ли в любом случае отключить обработчик ошибок laravel все вместе?

Я хочу просто отобразить стандартные ошибки PHP, не на Whoops, looks like something went wrong ошибки.

6 ответов


не без серьезного нарушения принципов структуры (что я расскажу вам, как это сделать ниже, если вы все еще заинтересованы).

есть несколько вещей, которые делают это трудно сделать. Достаточно легко отключить обработчики ошибок и исключений по умолчанию

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.

Последние Предупреждения

если handle изменения метода в будущей версии Laravel это сломается.

если пользовательские пакеты полагаются на добавление пользовательских обработчиков исключений, они могут сломаться.

Я бы рекомендовал держаться подальше от этого, как ничего, кроме временной техники отладки.


затем установить 'debug' => false, в \config\local\app.в PHP

<?php

return array(

    'debug' => false,

);

в laravel 5, чтобы отключить отладку, вам просто нужно прокомментировать

//'debug' => env('APP_DEBUG'),

в \config\app.файл php


обработка исключений жестко закодирована в Application класса. Вы можете переопределить классы :

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;

само собой разумеется, что это определенно не поощряется.


это приблизит вас. Возможно, есть более правильный способ сделать это. Он заменяет текущий обработчик исключений 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');
});

в файле .env, просто измените:

APP_DEBUG=true

В:

APP_DEBUG=false