Нужно ли вообще отключить обработчик ошибок laravel?
Я хочу просто отображать стандартные ошибки PHP, не ошибки Whoops, looks like something went wrong
.
Нужно ли вообще отключить обработчик ошибок 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;
Первое, что мы делаем, - это установить ошибки отображения отображения 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
. Вы можете переопределить классы в файле 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 есть встроенный метод отключения исключений в модульных тестах:
$this->withoutExceptionHandling()
Ларакаст по теме: https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/17
Это приблизит вас. Возможно, это будет более правильным способом. Он заменяет текущий обработчик исключений 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
To:
APP_DEBUG=false