読者です 読者をやめる 読者になる 読者になる

日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Laravel 5.1 入門記 その7(Response 編)

PHP Laravel

では 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 に進みます。