web-dev-qa-db-ja.com

無効laravel=エラーハンドラ

とにかくlaravelエラーハンドラーを一緒に無効にしますか?

standard PHP errorsnotWhoops, looks like something went wrongエラー。

25
Petah

フレームワークの原則に大きく違反することなく(まだ興味がある場合は、以下でその方法を説明します)。

これを達成するのを困難にするいくつかのことがあります。デフォルトのエラーおよび例外ハンドラを設定解除するのは簡単です

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メソッドが変更された場合、これは壊れます。

カスタムパッケージがカスタム例外ハンドラーの追加に依存している場合、それらは壊れる可能性があります。

一時的なデバッグ手法以外のものとして、これから離れることをお勧めします。

36
Alan Storm

次に、'debug' => false\ config\local\app.phpファイルに設定します

<?php

return array(

    'debug' => false,

);
10
Komal

laravel 5でデバッグを無効にするには、コメントするだけです

//'debug' => env('APP_DEBUG'),

\ config\app.phpファイル

5
rendra

例外処理は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;

言うまでもなく、これは絶対に推奨されません。

2
Andreas

質問に関連する:Laravelには、単体テストで例外を無効にするための組み込みメソッドがあります。

$this->withoutExceptionHandling()

件名のLaracast: https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/17

0
MacroMan