Отключить обработчик ошибок 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');
});