「速習Laravel 6」の感想・備忘録2

スポンサーリンク
「速習Laravel 6」の感想・忘備録1の続き

ルーティング

ルーティング

ルートパラメータ

Route::get('hello/{id}/{name}', 'HelloController@index');
※ アクションメソッド
public function index(int $id, string $name)

接頭辞

Route::prefix('members')->group(function() {
  Route::get('info', 'HelloController@info'); // /member/info
});

ルート名の定義

Route::get('info', 'HelloController@info')->name('infoinfo');

リソースルート

Route::resources('articles', 'ArticleController');
この1行だけで以下のアクションのルートが定義される。
index, show, create, store, edit, update, destroy
https://readouble.com/laravel/6.x/ja/controllers.html#resource-controllers

※ コントローラ作成コマンドに--resource --model=Xxxを付けるだけで対応するアクションが生成される。
php artisan make:controller ItemsController --resource --model=Article

リソースルートで生成されるルート

画面HTTPメソッドパスアクション
一覧表示GET/itemsindex
詳細表示GET/items/{item}show
登録フォームGET/items/createcreate
登録処理POST/itemsstore
編集フォームGET/items/{item}/editedit
更新処理PUT/items/{item}update
削除処理DELETE/items/{item}destroy

コントローラ

レスポンス

responseヘルパー

responseヘルパーを使うとIlluminate\Http\Responseオブジェクトを取得することができる。
return response('hello', 200)->header('Content-Type', 'text/plain');
return response()->view('xxx.yyy')->header('Content-Type', 'text/html');

※ 厳密には、引数を渡さない場合の戻り値はIlluminate\Routing\ResponseFactoryオブジェクトである

ただし、テンプレートの表示はResponseオブジェクトを介さずにviewヘルパーを使うのが一般的。
return response()->view('xxx.yyy');ではなくreturn view('xxx.yyy');

viewヘルパーの戻り値はViewオブジェクトだが、Responseオブジェクトのviewメソッドの戻り値はResponseオブジェクトである。
よって、cookie()などResponseクラスのメソッドを使う場合は、resopnse()->view()-->cookie()とする必要があり、view()->cookie()とすることはできない。

jsonメソッド

jsonメソッドでJSON形式のレスポンスを生成することができる。
return response()->json(['id' => 1, 'name' => 'hoge']);
※ ヘッダはContent-Type: application/jsonになる
※ 配列をreturnするだけでもjsonレスポンスになる

downloadメソッド, streamDownLoadメソッド

return response()->download('./robots.txt', 'hoge.txt', ['content-type' => 'text/plain']);
return response()->streamDownload(function () {
  print(
    "1,hoge\n".
    "2,hogehoge\n"
  );
}, 'hoge.csv', ['content-type' => 'text/csv']);

※ ファイルをそのままブラウザに表示する場合はfileメソッドを使う

リダイレクト

redirectヘルパー

Illuminate\Http\RedirectResponseが返却される。
return redirect('xxx.yyy');

redirectヘルパーを引数無しで呼ぶと、Illuminate\Routing\Redirectorインスタンスが返され、Redirectorインスタンスのメソッドが呼び出せるようになる。
ex) ルート名によるリダイレクト
return redirect()->route('hoge', ['id' =>999]);

外部サイトへのリダイレクト

return redirect()->away('https://google.com');

withInputメソッド

入力値をフラッシュデータとして保存することができる 。
return redirect()->route('index2')->withInput();

リダイレクト先では$request->old('username', 'default')のように取得可能。
また、oldヘルパーもあるのでviewで{{ old('username', 'default') }}とすることが可能。

withメソッド

任意のデータをフラッシュデータとして保存することができる。
return redirect()->route('index2')->with('msg', 'hoge');
取得は通常のセッションと同じだが、フラッシュなので一回で消える。

リクエスト

requestヘルパー

Illuminate\Http\Requestオブジェクトを取得することができる。
request()->path();

アクションメソッドにRequest型の引数を定義するだけで、Requestオブジェクトを取得することもできる。
こちらの方が一般的。
public function request(Request $request)
※ ルートパラメータも取得する場合は、Requestの後に引数を追加する
public function request(Request $request, $id)

Requestオブジェクトのメソッド

header, root, server, url, fullUrl, path, ip,userAgentなど。

フォーム変数の取得

動的プロパティまたはinputメソッドを使う。

  • $request->name;
  • $request->input('name', 'default');

※ デフォルト値をセットできるので、inputメソッドの方が一般的

ファイルアップロード

  • $request->hasFIle('myfile') // ファイルが指定されているか
  • $myfile = $request->myfile; // ファイル取得
  • $myfile->isValid() // アップロードできているか
  • $myfile->getClientOriginalName() // 元ファイル名
  • $myfile->store('ディレクトリ名'); // ファイル名は自動生成。ディレクトリ名は/storage/appからの相対パス。
  • $myfile->storeAs('ディレクトリ名', 'ファイル名'); // ファイル名指定

ミドルウェア

アクションメソッドの前後に処理を実行させるための仕組み。

  1. php artisan make:middleware XxxMiddleware
    app/Http/MiddleWareに生成される。
  2. handleメソッドに処理を追加
public function handle($request, Closure $next)
{
    // アクション実行前
    file_put_contents('./access.log', date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    $response = $next($request);
    // アクション実行後
    file_put_contents('./access2.log', date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    return $response;
}

※ ミドルウェアであることの条件は、handleメソッドを持つことだけ

  1. ミドルウェアをルーティングに登録する

Route::get('hello', 'HelloController@index')
  ->middleware(App\Http\Middleware\LogMiddleware::class);

  • 全アクションで実行させる場合はグローバルミドルウェアとして登録する。
    app/Http/Kernel.phpの$middleware配列に追加する。
  • ミドルウェアの用途に応じてグループ化する。
    app/Http/Kernel.phpの$middlewareGroups連想配列に追加する。
    ルーティングでgroupメソッドの第1引数で指定する。
    Route::group(['middleware' => ['Xxx']], ]function() {
      Route::get('hoge', 'HogeController@index');
    });

クッキー

保存

Responseオブジェクトのcookieメソッドを使う。
return response()->view('hello.request')->cookie('test_val', '100', 600);
レスポンスのところでも書いたが、cookieメソッドはResponseクラスのメソッドなのでviewヘルパーを使ってview()->cookie()とすることはできない。

取得

Requestオブジェクトのcookieメソッドで取得することができる。
$request->cookie('test_val');

セッション

設定

config/sesson.php
'driver' => env('SESSION_DRIVER', 'file'),など

読み書き

Requestオブジェクトのsessionメソッドで取得できる。
\Illuminate\Session\Storeオブジェクトのput, getメソッドを使う。

  • $request->session()->put('msg', 'hoehoge');
  • $request->session()->get('msg', 'default');

他にall, pull=取得後に削除, has, forget, flush, flash, reflash, regenerateなどのメソッドがある。

※ sessionヘルパーを使うこともできる。

  • session(['msg' => 'hogehgoe']);
  • $msg = session('msg', 'default');

SESSION_DRIVERをdatabaseにした場合、以下のコマンドでsessionsテーブルを作成する必要がある。
php artisan session:table
php artisan migrate

フラッシュ

フラッシュとは次のリクエストでのみ維持される特殊なセッションのこと。
リダイレクト先でメッセージを表示させる場合などに便利。
return redirect('request')->withInput();

コメント