Laravel使ってみた (3) - Routing -

2013-06-11T00:00:00+00:00 Laravel PHP

前にもちょっとだけ書いたけど、ルーティング定義はapp/routes.phpに定義する

  • GETならRoute::get
  • POSTならRoute::post
  • PUTならRoute::put
  • DELETEならRoute::delete

というような定義法を使用する。でRestfulなルーティング定義を使いたいのであれば、Route::resourceを使う事が出来る。例えばHomeControllerをRoute::resourceで定義後に「artisan routes」を行った場合

+--------+------------------------+----------+------------------------+----------------+---------------+
| Domain | URI                    | Name     | Action                 | Before Filters | After Filters |
+--------+------------------------+----------+------------------------+----------------+---------------+
|               |
|        | GET /                  | .index   | HomeController@index   |                |               |
|        | GET /create            | .create  | HomeController@create  |                |               |
|        | POST /                 | .store   | HomeController@store   |                |               |
|        | GET /{}                | .show    | HomeController@show    |                |               |
|        | GET /{}/edit           | .edit    | HomeController@edit    |                |               |
|        | PUT /{}                | .update  | HomeController@update  |                |               |
|        | PATCH /{}              |          | HomeController@update  |                |               |
|        | DELETE /{}             | .destroy | HomeController@destroy |                |               |

というようなルーティングが生成される模様

ルーティングのパラメーターに条件を付ける

Route::get("user/{id}", "UserController@show");

みたいな場合に{id}部分に条件を付けたい。例えば正規表現で^d+$でマッチするのだけルーティングとして有効にしたい場合には

Route::get("user/{id}", "UserController@show")->where("id", "^d+$");

というようにwhereで条件を指定出来る

Route::groupを使う

ルーティングにプレフィックスをつけたり出来る模様

<?php

Route::group(
    array("prefix" => "admin"),
    function() {
        Route::get("user/{id}", "UserController@show");
    }
);

ルーティングパラメーターをモデルに変換する

Route::modelを使う事でルーティングパラメーターをモデルに変換出来る模様

<?php

Route::model("user_id", "User");
Route::get("user/{user_id}", "UserController@show");

コントローラーのメソッドの引数には変換されたモデルのインスタンスが格納される。もし、マッチするレコードが無い場合にはNotFoundExceptionがスローされる(第3引数のClosureを指定しなかった場合)

でそのパラメーターからモデルに変換する処理を定義したい場合にはbindを使えば出来る模様

<?php

Route::bind(
    "user_id",
    function($value) {
        return User::where("id", $value)->first();
    }
);

とりあえず曖昧な部分ありドキュメント読みつつ追記しようかと

追記1. コントローラーでHTTPエラーを送出させる

<?php

App::abort(HTTPコード)

で可能。404の場合はNotFoundExceptionがスローされ、それ以外ではHttpExceptionがスローされる

追記2. ルーティングに名前を割り当てる

<?php

Route::get(
    "user/{id}",
    array("as" => "user", "uses" => "UserController@show")
);

っていう感じで、asで名称を指定出来る。でコントローラー等で

<?php

echo URL::route("user", 1);

// Redirect::route("user", 1);

っていう感じでリダイレクト先だとかを生成したり出来る。でパラメーターが必要なケース等において、引数を指定しなかった場合とかはMissingMandatoryParametersExceptionがスローされる

ちなみに上記を設定した状態でartisan routesをすると

+--------+----------------+------+---------------------+----------------+---------------+
| Domain | URI            | Name | Action              | Before Filters | After Filters |
+--------+----------------+------+---------------------+----------------+---------------+
|        | GET /user/{id} | user | UserController@show |                |               |
+--------+----------------+------+---------------------+----------------+---------------

というようにasで指定したのがName区で表示される。ここの名称名で処理出来るって事かと

ダウンロードしてきたプログラムとかをUbuntuのアプリケーションに登録する方法 rspec-railsのドキュメント読み