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