2016-07-24 3 views
4

show($id)メソッドがルートにヒットしました。コントローラメソッドではないメソッドからレスポンスを送信する方法は?

public function show($id) 
{ 
    // fetch a couple attributes from the request ... 

    $this->checkEverythingIsOk($attributes); 

    // ... return the requested resource. 
    return $response; 
} 

は今、checkEverythingIsOk()に、私はいくつかの検証と承認のものを実行します。これらのチェックは、同じコントローラ内の複数のルートに共通しているので、これらのチェックを抽出し、同じ操作を実行する必要があるたびにメソッドを呼び出したいと思います。

問題は、私はこの方法からいくつかの応答を送信することができませんよ、次のとおりです。

private function checkEverythingIsOk($attributes) 
{ 
    if (checkSomething()) { 
     return response()->json('Something went wrong'); // this does not work - it will return, but the response won't be sent. 
    } 

    // more checks... 
    return response()->callAResponseMacro('Something else went wrong'); // does not work either. 

    dd($attributes); // this works. 
    abort(422); // this works too. 
} 

注:はい、私は一般的なものに知っては前にチェックを実行するミドルウェアや検証サービスを使用することができます要求はコントローラにヒットしますが、私はしたくありません。私はこのようにする必要があります。おそらく、この探している

答えて

3

function checkEverythingIsOk(){ 
    if (checkSomething()) { 
     return Response::json('Something went wrong', 300); 
    } 
    if(checkSomethingElse()) { 
     return Response::someMacro('Something else is wrong') 
    } 
    return null; // all is fine 
} 

とコントローラメソッドで:

$response = $this->checkEverythingIsOk(); 
if(!is_null($response)) { 
    return $response; 
} 
+0

エラーメッセージの応答形式は、すべてのエラータイプで同じではありません。時には、データベースから他のデータをフェッチする応答マクロを呼びたいときもありますが、メッセージを印刷したり、中止したりするときには、他の時も使用します。 – hallaplay835

+0

'return $ this-> checkEverythingIsOk($ attributes); '? 'dd()'と 'abort()'はとにかくスクリプトの実行をキャンセルします。すべてが正常であれば 'null'を返し、そうでなければレスポンスを返すことができます。コントローラメソッドで単純なチェックを行います。 – Voyowsky

1

それはおそらく行き過ぎだが、私はとにかくそれをスローします。内部要求を調べることができます。これはちょうど偽のコードです、私は実際にこれを行っていないので、注意してこの情報ビットを取る。

// build a new request 
$returnEarly = Request::create('/returnearly'); 

// dispatch the new request 
app()->handle($newRequest); 

// have a route set up to catch those 
Route::get('/returnearly', ...); 

今、あなたはそのルートの最後に座ってコントローラーを持っており、パラメータを解釈するか、複数のコントローラ/メソッドによって答え、複数のルートを使用...あなたまで、しかしアプローチは同じまますることができます。

UPDATE

は、[OK]を、私は自分自身が、新しい要求を作成し、それを派遣することを試みたが、それはこのように動作します。問題は、子リクエストが終了しても実行が停止しないことです。それは親の要求に続きます。このアプローチは役に立たないものになります。

しかし、私は別の方法について考えていましたが、例外をスローして適切な場所にキャッチして特定の応答を返さないようにしてください。

が判明し、すでにLaravelに組み込まれてthatsの:

// create intended Response 
$response = Response::create(''); // or use the response() helper 

// throw it, it is a Illuminate\Http\Exception\HttpResponseException 
$response->throwResponse(); 

今すぐ通常の例外がログに記録されるだろうし、あなたがデバッグモードになっている場合は、あなたが画面などなどでそれを見るだろうが、あなたが取る場合 renderメソッド内の \Illuminate\Foundation\Exceptions\Handlerを調べると、 HttpResponseExceptionのインスタンスであればスローされたExceptionを検査することがわかります。そうであれば、レスポンスはすぐに返されます。

+0

これを回避するために時間をとってくれてありがとうございますが、あなたのアプローチは、@ Vojo123と本質的に同じですが、ヌルチェックの代わりに例外をキャッチしますが、内部リクエストの作成と処理の複雑さが増します。Laravel APIのドキュメントを見ると、コントローラメソッド以外のメソッドから本格的なリクエストを送る方法がないことが分かるので、これらの2つの回避策は得られるほど良いものです。 – hallaplay835

+0

内部リクエスト部は、とにかく動作しません。それを無視してください。スローされたレスポンスは独自の解決策です。レスポンス(...) - > throwResponse()のように1行で記述することもできます。すでにLaravelにキャッチが組み込まれているので、それは回避策ではなく実際に意図されたユースケースです。 – mwallisch

+0

うん、これも動作します。このソリューションをありがとう。 – hallaplay835

関連する問題