とにかくlaravelエラーハンドラーを一緒に無効にしますか?
standard PHP errors、notWhoops, looks like something went wrong
エラー。
フレームワークの原則に大きく違反することなく(まだ興味がある場合は、以下でその方法を説明します)。
これを達成するのを困難にするいくつかのことがあります。デフォルトのエラーおよび例外ハンドラを設定解除するのは簡単です
set_error_handler(null);
set_exception_handler(null);
しかし、それはあなたに2つの大きなハードルを残します。
最初のLaravelは、ブートストラップの一部としてシャットダウンハンドラーを登録します。このシャットダウン関数は最後のエラーを探し、致命的なエラーの場合は、例外処理コードを手動で呼び出します。 シャットダウン関数の登録を解除する簡単な方法はありません があります。
2番目は、メインの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からアプリケーションのboot/dispatchを削除します。これはプロセスの最も脆弱な部分であり、Laravelのバージョンによって異なる場合があります。
Laravelの将来のバージョンでhandle
メソッドが変更された場合、これは壊れます。
カスタムパッケージがカスタム例外ハンドラーの追加に依存している場合、それらは壊れる可能性があります。
一時的なデバッグ手法以外のものとして、これから離れることをお勧めします。
次に、'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()
件名のLaracast: https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/17