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

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

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

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

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

     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 на 1 . Это гарантирует, что ошибки выводятся в браузер.

    Затем мы определяем новый класс приложения, который расширяет реальный класс приложения.

    Наконец, мы заменим реальный объект $app 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 . Вы можете переопределить классы в файле 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; 

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

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