LOG

Laravel5でrouting

routingを行うにはRouteファサードを利用する。

メソッド対応するHTTP動詞
Route::get($uri, $action=null)GET,HEAD
Route::post($uri, $action=null)POST
Route::match($methods, $uri, $action=null)対応するHTTP動詞を指定
Route::any($uri, $action=null)全てのHTTP動詞に対応
引数説明
$uriStringroutingするパスを指定する
パラメータがある場合は{xxx}か{xxx?}で指定する
$actionString | Function | Arrayrouteに対する処理を指定する
配列を使い詳細な設定も行える
$methodsString | Array対応するHTTP動詞を指定する
複数ある場合は配列で指定する

引数「$action」は少し複雑

// Stringの場合 -> コントローラーを指定する
// routeの処理としてコントローラーMyControllerのtestメソッドが利用される
Route::get('test/','MyController@test');

// Functionの場合 -> コントローラーの変わりに処理するクロージャになる
Route::get('test/', function(){
    return 'test!';
});

// Arrayの場合 -> コントローラかクロージャはusesキーを使って指定する
Route::get('test/', [
    'uses' => 'MyController@test'
]);

配列の場合、以下のようなパラメータを渡せる

パラメータ説明
usesFunction | Stringコントローラの指定
asStringURLに名前を付ける。パスに変更があった場合やリダイレクトに便利
middlewareStringmiddlewareを指定する
domainStringドメインの一致

補足

// actionにArrayを使い、コントローラの変わりにクロージャを使うのであれば、usesキーは省略できる
// --------------------------------------
Route::get('test/',[function(){
    return 'test';
}]);
// でもまぁuses使ったほうがいいかな

// --------------------------------------
// パラメータ「as」はnameメソッドで後から追加することができる。
// --------------------------------------
Route::get('test/',function(){ return 'test'; })->name('test');

// --------------------------------------
// middlewareはパスを渡せば良い
// --------------------------------------
// Kernel.phpの$routeMiddlewareではmiddlewareのパスのラベルを定義しなくも直接パスを渡せばいいっぽい。
Route::get('test/',[
    'middleware' : \App\Http\Middleware\TestMiddleware::class,
    'uses'       : function(){ return 'test'; }
]);
// 名前変えたとき大変なんでKernel.phpに定義したほうがよさげ。

// --------------------------------------
// domainは以下のような感じでも使える
// --------------------------------------
Route::get(['domain'=>'{subdomain}.yokotakenji.me'],'MyController@index');

Route::group

Route::groupはrouteを一括して登録するための機能
ネストで構造をあらわす。

引数説明
$attributesArrayグループ内の設定
$callbackFunctionグループ内の処理

引数$attributesでは以下指定できる

パラメータ説明
asStringURLに名前を付ける。パスに変更があった場合やリダイレクトに便利
middlewareString | ArrayRoute::groupで定義したmiddlewareはグループ全体で適用される
domainStringドメインの一致
prefixString例えばprefixをrootとしてgroupでtestというroute処理をかけば、root/testに適用される
namespaceStringグループ内のコントローラーへ名前空間を指定する

なんかもっとあるっぽい。

Route::group( ['domain'=>'novel', 'prefix'=>'a', 'namespace'=>'MyDir'], function(){
    Route::group(['prefix'=>'b', 'middleware'=>'myMiddleware'],function(){
        // ここで定義したroutingは全てmyMiddlewareが実行される
        // namespaceを指定しているのでコントローラーの名前空間はMyDir以下が参照される
        Route::get('c/', ['uses'=>'MyController@test']); // mySite/a/b/cがヒットする
    });
});

Route::controller

コントローラーを指定する際、対応するメソッドを指定するが
Route::controller、Route::controllersを使うと
コントローラーを指定するだけでいい。
(ただしメソッド名はLaravelの仕様に合わせる必要がある)

これを暗黙のコントローラーというらしい。

種類

Route::controllerControllerに移譲
Route::controllersControllerに移譲

Route::resource

リソースに関するRESTフルコントローラーを提供できる。

変数パスアクションルート名
GET/リソース名indexresource.index
GET/リソース名/createcreateresource.create
POST/リソース名storeresource.store
GET/リソース名/{resource}showresource.show
GET/リソース名/{resource}/editeditresource.edit
PUT/PATCH/リソース名/{resource}updateresource.update
DELETE/リソース名/{resource}destroyresource.destroy

引用:Laravel 5.0.dev HTTPコントローラー

一部のみを取り扱う

// indexとshowだけ
Route::resource('photo', 'PhotoController',
                ['only' => ['index', 'show']]);

// create、store、update、destroyを期待
Route::resource('photo', 'PhotoController',
                ['except' => ['create', 'store', 'update', 'destroy']]);

ネスト

Route::resource('photos.comments', 'PhotoCommentController');

whereを使ってパラメーターのフォーマットを限定する

「a」が英字のみのときに処理する

Route::get('test/{a}',function($a){
    return xxx;
})
->where('a','[A-Za-z]+');

複数の場合

Route::get('test/{a}/{b}',function($a,$b){
    return xxx;
})
->where([
    'a' => '[A-Za-z]+',
    'b' => '[A-Za-z]+'
]);