Подтвердить что ты не робот

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

Нужно ли вообще отключить обработчик ошибок laravel?

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

4b9b3361

Ответ 1

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

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

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;

Первое, что мы делаем, - это установить ошибки отображения отображения ini на 1. Это гарантирует, что ошибки выводятся в браузер.

Далее мы определяем новый класс приложения, расширяющий класс реального приложения.

Наконец, мы заменяем реальный объект Laravel $app объектом, созданным нашим классом.

В нашем классе приложения мы закроем startExceptionHandling. Это не позволяет Laravel настраивать пользовательские исключения, ошибки и выключения. Мы также определяем handle для удаления загрузки/отправки приложения из try/catch. Это самая хрупкая часть процесса и может выглядеть по-разному в зависимости от вашей версии Laravel.

Заключительные предупреждения

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

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

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

Ответ 2

Затем установите 'debug' = > false в файле \config\local\app.php

<?php

return array(

    'debug' => false,

);

Ответ 3

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

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

в файле\config\app.php

Ответ 4

Обработка исключений жестко закодирована в классе 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;

Разумеется, это определенно не рекомендуется.

Ответ 6

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

Ответ 7

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

APP_DEBUG=true

To:

APP_DEBUG=false