Laravel 5.1 入門記 その7(Response 編)
では Responses に入門します。
HTTP Responses - Laravel - The PHP Framework For Web Artisans
Basic Responses
Laravel でルーティングに設定された action (Controller のメソッドや closure) は、文字列か、Illuminate\Http\Response を返すようになっています。ちなみに文字列を返した場合は、暗黙的に Illuminate\Http\Response に置き換えられてるとのこと。文字列を返す例はこちら。
Route::get('/', function () {
return 'Hello World';
});
入門記の最初のほうで見た例ですね。これを Response クラスを使って置き換えると
Route::get('/', function () {
return (new Illuminate\Http\Response('Hello World', 200))
->header('Content-Type', 'text/plain');
});
こんな感じになります。header の設定は不要かもですが。続いて、 response のショートカット関数を使ってみます。
Route::get('/', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});
括弧が一つ減り、名前空間も不要になったため結構短くなります。特に理由が無ければ、ショートカット関数を使うのが良さそう。ちなみにヘッダーを追加したり cookie の値を設定したりするときは、メソッドチェインで記述できる。
Route::get('/', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain')
->header('X-OreOre-Header1', '1')
->header('X-OreOre-Header2', '2')
->withCookie('name', 'value');
});
withCookie は他にも値が設定でき、以下のような感じ。
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
Laravel の Cookie は自動的に署名付き暗号化されてしまうけど、それを外したいときは App\Http\Middleware\EncryptCookies の except に Cookie のキーを追記すれば良いみたい。
protected $except = [
'cookie_name',
];
こんな感じですね。
Other Response Types
response 関数は引数無しで呼び出すと Illuminate\Contracts\Routing\ResponseFactory を返すので、色々な response を選択することができるらしい。とりあえずドキュメント上で紹介されているのは 3 種類。
- view
- JSON
- file download
view はこんな感じらしい
return response()->view('hello', $data)->header('Content-Type', $type);
でも、まだ view の説明をされていないから、ここではスルー。続いて JSON。
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
返したいデータを array に詰めて渡すだけなので簡単。JSONP の対応も入っているみたいで、次のように callback 関数名を渡してあげれば、JSONP ように wrapping される。
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
地味に便利です。
次はファイルダウンロード。
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
2つめの例の第2引数は、ダウンロードしたときのファイル名になるらしい。ただ、 symfony 依存の部分でファイル名は、ascii のみしか指定出来ないらしい。マルチバイトなファイル名を指定したい時は自分でエンコードする必要がある。 そして第3引数は、ヘッダーを渡すらしい。 ->header で指定できないのは、イマイチ感がありますね…。
Redirects
リダイレクトは redirect のショートカット関数に、URL を渡せばそれで OK らしい。
リダイレクト周りのサポート機能として、入力フォームを今居る URL では無く他の URL に POST したときのため、入力フォームに戻る機能もある。
Route::post('user/profile', function () {
// リクエストのバリデーション…
return back()->withInput();
});
使うのかな、これ…。
reponse 関数と同じように、redirect 関数も引数無しで呼び出すと locator である Illuminate\Routing\Redirector を返すので、それを使うと、ルーティング上の名前や action 名から URL を引くことができる。
return redirect()->route('profile', [1]);
とか
return redirect()->action('UserController@profile', [1]);
となる。なるべく名前付きルーティングを使ったほうが安全そうだ。
Redirecting With Flashed Session Data
フラッシュデータをセッションに保存しつつ、リダイレクトも可能な模様。
Route::post('user/profile', function () {
// Update the user's profile...
return redirect('dashboard')->with('status', 'Profile updated!');
});
フラッシュデータは、リダイレクト先にアクセスしたら無くなるのかどうなのか、ライフサイクルが知りたいけど書いてないのね…。
そして Blade template で session から表示する。 Blade template がまだ出て来てないから、ファイルをどこに置いて良いのかも分からないけど!
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
Response Macro はイマイチ使いどころが見えなかったので飛ばします。必要になったら勉強しよう。
次は Views に進みます。