ぬぬん!

やってみたこと,思ったこと

【這いよれLaravelさん】ルーティング (1)

初回、ルーティングを勉強しよう

公式はこちら

はい、では基本ルーティングから

基本ルーティング

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>

こういう感じにしてあげないと動かないので注意

参考

qiita.com