4

Laravel 5 と Dingo を使用して API を構築しています。ルートが定義されていないリクエストをキャッチするにはどうすればよいですか? API が常に特別にフォーマットされた JSON 応答で応答するようにします。

たとえば、ルートがある場合: $api->get( 'somepage','mycontroller@mymethod');

ルートが定義されていないと仮定して、誰かが同じ uri への投稿を作成した場合、どのように処理すればよいですか?

基本的に何が起こっているかというと、Laravel が MethodNotAllowedHttpException をスローしているということです。

私はこれを試しました:

    Route::any('/{all}', function ($all) 
    {
        $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::json($errorResponse, 400);     //400 = Bad Request
    })->where(['all' => '.*']);

しかし、 MethodNotAllowedHttpException がスローされ続けます。

これを行う方法はありますか?ミドルウェアを使用していますか? キャッチオールルートの他の形式はありますか?

編集:

これを app\Exceptions\Handler.php に追加しようとしました

public function render($request, Exception $e)
{
    dd($e);
    if ($e instanceof MethodNotAllowedHttpException) {
        $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::json($errorResponse, 400);
    }
    return parent::render($request, $e);        
}

効果はありませんでした。私はダンプオートロードなどを行いました。dd($e) を追加しても効果はありませんでした。これは私には奇妙に思えます。

編集 - 解決策

理解した。ジェームズの答えは正しい方向に考えさせてくれましたが、何が起こっていたのかというと、ディンゴがエラー処理をオーバーライドしていたということです。このエラーに対する応答をカスタマイズするには、app\Providers\AppServiceProvider.php を変更する必要があります。このようにブート関数を作成します(デフォルトでは空です)

public function boot()
{
    app('Dingo\Api\Exception\Handler')->register(function (MethodNotAllowedHttpException $exception) {
         $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::make($errorResponse, 400);
    });
}

正しい方向に進んだので、ジェームズの答えを受け入れます。

これが誰かに役立つことを願っています:)これは私の夜の大部分を占めました....

4

1 に答える 1