初回、ルーティングを勉強しよう
公式はこちら
はい、では基本ルーティングから
基本ルーティング
app/Http/routes.phpに記述していく
HTTPメソッドを指定してルーティングを書くことが出来る
以下の感じで
Route::<HTTPメソッド名>('パス', クロージャ);
クロージャ部分はfunction(){}
でもいいけど
コントローラーのメソッドを指定する感じでもおk
実際に書いたものはこちら
Route::get('/', function () { return view('route'); }); Route::get('foo', function () { return 'getで来た'; }); Route::post('foo/bar', function () { return 'postで来た'; }); Route::put('foo/bar', function () { return 'putで来た'; }); Route::delete('foo/bar', function () { return 'deleteで来た'; });
適当なviewを作って記述通りにルーティングできているか確認
複数のHTTPメソッドを指定したルーティング
// 複数のHTTPメソッド確認 Route::match(['get', 'post'], '/match', function () { return 'getかputで来た'; }); Route::match(['delete', 'put'], '/match', function () { return 'put/deleteで来た'; });
ルートパラメーター
ルートからパラメーターを取得することが出来る
// ルートパラメーター Route::get('name/{name}', function ($name) { return 'あなた ' . $name . 'っていうのね!!!'; }); Route::get('name/{name1}/{name2}', function ($name1, $name2) { return $name1 . '!!!あなた ' . $name2 . 'っていうのね!!!'; });
クロージャのところに受け取る変数を書いておけば
前から順番に割り当てられていきます
パラメーターの付加を任意にする場合
パラメーターの末尾に?
を付けることで可能になる。
// パラメーター取得(任意) Route::get('name/{name1?}', function ($name1='めい') { return 'いるなら返事しな!' . $name1 . '!!!'; });
この時、当たり前ですがクロージャで初期値を設定しておかないと怒られます
パラメーターにバリデーション
受け取るパラメーターに制限を設ける場合、where()
メソッドを生やすことで可能になる
// パラメーターのバリデーション Route::get('name/{name}', function ($name) { return '妹の' . $name . 'です'; }) ->where('name', '[a-z]+');
どのルートでも任意のパラメーターに対して制限を設けたいとなると app/Providers/RouteServiceProvider.phpのboot()に記述しておくことで route.phpに書かなくてもよくなる
public function boot(Router $router) { // $router->pattern('name', '[a-z]+'); parent::boot($router); }
ルートに名前がつけれる
ルートにname()
をはやすことで
ルートに名前がつけれる。
Route::get('shout', function () { return 'こら!!!かんた!!!'; }) ->name('shout');
これの便利なところはviewで遷移先を記述する際に
以下のように書けてスマートなのがいい
<a href="{{route('shout')}}">かんたを叱る</a>
ルートグループ
パスをグルーピングしたい時や、前処理を挟んでから そのルートに入って欲しい時に使うと便利
// ルートグループ Route::group(['middleware' => 'auth'], function () { Route::get('/kusakabeke', function () { // authミドルウェアが使用される }); Route::get('kusakabeke/satsuki', function () { // authミドルウェアが使用される }); });
サブドメインルーティング
アプリによっては管理画面作りたかったりするので これが便利なんじゃないかと言う話
// サブドメインルーティング Route::group(['domain' => '{account}.kusakabe.com'], function () { Route::get('user/{id}', function ($account, $id) { }); });
この場合だと、アカウント種別ごとにサブドメインが切られていて ルーティングが違うよって感じ。
まだ出くわしたことがない状況だけど、一応覚えておこう
おまけという名の補足
csrfは今いらない
Laravelさんの優しさで常にform送信時にcsrfを求めてくるけど 今回は簡単な動作確認なので無効化したい。
そんな時は app/Http/Kernel.phpの
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, // \App\Http\Middleware\VerifyCsrfToken::class, ここをコメントアウト ],
するとcsrfを無効化出来る
put/deleteメソッドが動かない
<form method="delete"> </form>
では動かない
<form method="delete"> <input name="_method" type="hidden" value="delete"> </form>
こういう感じにしてあげないと動かないので注意
参考