Laravel レスポンス入門|返したい形式を何でも返す方法

今回は、Laravelのhttpレスポンスの返し方を見ていきます。
自分で実装すると複雑なhttpレスポンスですが、Laravelを使えば簡単に実装ができます。

前提知識として本記事はLaravelのライフサイクルが頭に入ってい方が理解が深まります。そのため、Laravelのライフサイクルがわからない方はまずは下記の記事からご覧ください。

レスポンスの生成

Laravelのレスポンスを返すのは以下の3パターンにわかれます。

  • 1,文字列、配列を返す
  • 2,viewヘルパー関数を返す
  • 3,レスポンスオブジェクトを返す

まずは単純な文字列、配列を返すパターンを見ていきましょう。

1つ目|文字列と配列を返すパターン

コントローラーを返さずに、文字列を返したいという場合、(想定としては、ルートが通っているか確認したい場合など)下記のように記載すれば可能です。

Route::get('/', function () 
     return ‘Sample’;
});

下記のように配列を記載すると、自動的に配列をJsonレスポンスに変更してくれます。便利ですねー!

Route::get('/', function () 
   return 1, 2, 3;
});

もちろん、上記のような単純な仕様はなかなかないと思いますので、次は、より実践的なviewヘルパー関数を使う場合を見ていきましょう、

2つ目|viewsを返すパターン

レスポンスのステータスやヘッダをコントロールしながらも、レスポンス内容としてビューを返す必要がある場合は、viewメソッドを使用してください。

Route::get(‘/‘,function()
     return  view(‘welcome’);
}
});

上記のようにすることで、resource/views配下にあるbladeファイルを参照してviewを表示することができます。

変数を加えて渡したい場合

初学者の場合は、下記のように渡すのが最も分かりやすいでしょう。

public function index(){
 $test = “sample”;
return view('messages.index', [
'm' => $test,
  ]);
}

変数を、配列に入れて配列で渡しています。理解をする際にはこれで構いませんが、実際に使うとなるとcompact関数を使うのがより実践的でしょう。

Compact関数を使う場合は同じ処理を下記のように記載できます。

public function index(){
   $test = “sample”;
  return view('messages.index', compact(‘test’)
}

compact関数とは
実施していることは、上記で説明したことと変わりません。compact関数は、渡された変数名と値から配列を生成し返します。laravelではなくphpのヘルパ関数となります。下記が使用例になります。 

<?php
$one = 1;
$two = 2;
$three = 3;
$four = 4;
$five = 5;
$array = compact( “one”, “two”, “three”, “four”, “five” );
print_r( $array );
?>
Array
([one => 1],[two => 2],[three => 3],[four => 4],[five=> 5])

ヘッダーを付与したい場合

ヘッダーを付与したい場合は、responseを最初に入れて、メソッドチェーンでviewヘルパ関数➡︎headerとしてください。

return response()
            ->view('hello', compact(‘test’))
            ->header('Content-Type', $type);

3つ目|レスポンスオブジェクトを返すパターン

Viewのところで、少し出てきましたが、
続いて、レスポンスオブジェクトを返すパターンを見ていきましょう。
レスポンスオブジェクトとは、IlluminateHttpResponseインスタンスを返すということです。

このインスタンスを返すことで、httpステータスコードや先ほどのようにヘッダをカスタマイズすることができます。

まずは一つ例を見てみましょう。

Route::get('home', function () {
    return response('Hello World', 200)
                  ->header('Content-Type', 'text/plain');
});

上記のresponse()では、返したい文字列と成功したことを表すステータスコード200と単なるテキストデータであることを表すヘッダーを返しています。

*ちなみにですが、このResponseインスタンスは、SymfonyComponentHttpFoundationResponseクラスを継承しております。

さまざまなメソッドが使えるので、その一部を見ていきましょう。

ヘッダを複数セットする

先ほどは一つだけヘッダをセットしていましたが、下記のようにすることでヘッダを複数セットすることができます。

return response($sample)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

リダイレクトをする

Laravelでredirectを実装するのは、下記のようにredirectメソッドを使うのが簡単です。

Route::get(‘/‘, function () {
    return redirect('home/welcome’);
});	

上記のようにするだけで/にアクセスした際に、’home/welcome’にリダイレクトができます。

Routeヘルパ関数を使うと、名前つきルートでリダイレクトができます。

return redirect()->route(‘sample’); 

ルートにパラメータが含まれている場合は下記のようにすることでパラメータを含めることができます。

Route::get('/', function () {
	return redirect()->route(‘sample’, [’id’ => ’1’]);
});
外部のurlにリダイレクトしたい場合は下記のようにできます。
return redirect()->away('https://storehouse-techhack.com/');
バリデーション処理からリダイレクトで元の画面に戻したい場合

下記のようにすることで入力したデータを持ったまま、戻すことができます。withinputを忘れてしまうとただの空欄のフォームを戻すという仕様になってしまうので気をつけてください。

Route::post('user/profile', function () {
    // レスポンスのバリデーション処理…
    return back()->withInput();
});

よく使います重要!| JSONレスポンスを返したい

json形式で返すのは非常によく使いますので、覚えておいてください。

Laravelでjsonを返す場合は、上述した通りに配列を返すだけでもできるのですが、下記のようにしても返すことが可能です。

jsonメソッドは自動的にContent-Typeヘッダをapplication/jsonにセットし、同時に指定された配列をjsonencode PHP関数によりJSONへ変換します。

return response()->json([
    'name' => ‘taro’,
    'id' => 1
]);
);

ファイルのダウンロードを可能にする

downloadメソッドを使用することで、指定のファイルパスのファイルをダウンロードすることができます。

return response()->download($pathToFile);
非公開ファイルをダウンロードさせたい場合

下記のようにすることでstorage/app/public配下にあるファイルのダウンロードを可能にします。

第2引数は、ユーザーがダウンロードするファイル名。

第3引数はHTTPヘッダ。

public function download(Request $request){
    $headers = ['Content-Type' => 'text/plain'];
    $filename = ‘sample.txt';
    return response()->download(Storage::path('public/sample.txt'), $filename, $headers);
 }

*単に公開ファイル(public配下にあるファイル)をダウンロードしたい場合は、下記のようなコードによっても実装ができます。

<a  href="{url('/images/sample.png')}" download>ダウンロード</a>

ブラウザにファイルを表示する

fileメソッドは、ダウンロードする代わりに、ブラウザへ画像やPDFのようなファイルを表示するために使用します。このメソッドは第1引数にファイルパス、第2引数にヘッダの配列を指定します。

return response()->file($pathToFile);
return response()->file($pathToFile, $headers);

まとめ

Laravelのレスポンスはかなり便利に色々とできるので、ぜひぜひ実装時に使えると良いですね。特にjsonはよく使うので理解しておいくださいね!

こちらの記事もおすすめ!

Laravelを理解するためには、こちらの記事もおすすめですのでみておいてくださいね。

コメントを残す