これでLaravelのRouting(ルーティング)は完璧だ!

Posted in Laravel on 9月 29, 2016

LaravelのRouting(ルーティング)の基本を完全に理解するためには、Laravelのドキュメントに記載されていることをすべて理解することだと思います。しかし、初心者の時は、ドキュメントは思いのほかハードルが高かったりするので、ドキュメントを参考にしながら、実機で確認した結果も合わせて記載するので、 マニュアルよりも理解しやすくなっているかと思います。ぜひ参考にしてルーティングマスターして下さい。

【注意】 バージョンが上がるたびにルーティングにも機能拡張が行われているので、時間がたてば内容も変わってきます。 この記事では、現在の最新版5.3で動作確認を行ったもののみ記載をしています。

ルーティングファイルの場所

これまでは、\app\Http\routes.phpファイルにルーティングを記述していましたが、Laravel 5.3からはディレクトリ構造が変わって、 \routesディレクトリの中にルーティングのファイルが格納されています。

3つのファイルがありますが、主に\routes\web.phpにルーティング情報を記述していきます。

※api.phpというファイルもありますが、web.phpとの違いはまた別の機会で記載します。

ルーティングは何をするのか?

ユーザがアクセスしてきたURLの文字列を判断して、自分で処理を行ったり、その後の処理を任せたりといった窓口的な役割を持っています。

例えばデフォルトでルーティングファイルに記載のある下記は,www.yoursite.com/にアクセスがあると、view関数を使用して テンプレートファイルwelcomeに記述されている内容をブラウザ上に表示させます。

Route::get('/', function () {
    return view('welcome');
});

実際にインストール直後のLaravelのルートにアクセスすると以下の画面が出力されます。

初期画面

その他にも/about, /info, /homeにアクセスがあった場合、どうするのかをファイルの中に記載していきます。

Route::get('/about', function () {
   .......
});

Route::get('/info', function () {
   .......
});

Route::get('/home', function () {
   .......
});

最も基本的なルーティング

最もシンプルなルーティングは、以下のURLとクロージャで記述されたルーティングです。

Route::get('foo', function () {
    return 'Hello World';});

ブラウザでwww.yoursite.com/fooにアクセスすると無名関数が実行され、ウェブページには、Hello Worldが表示されます。

ルートパラメータ

URLからパラメータの値を受け取ることもできます。

例えば1というパラメータを渡したい時にブラウザでwww.yoursite.com/user/1にアクセスした場合。

下記のように記述すると、パラメータの値を渡すことができます。

Route::get('user/{id}', function ($id) {
    return 'User '.$id;});

ブラウザには、User1と表示されます。

ここでは、受け取る値がユーザのidなので、idとしていますが、どのような名前でもかまいません。 idからnameに変更を行い、johnと入力するとUserjohnと表示されます。

http:://www.yoursite.com/user/john

Route::get('user/{name}', function ($name ) {
    return 'User '.$name ;});

パラメータはオプションなので、何もパラメータを指定しないという場合もあるかと思います。しかし、http:://www.yoursite.com/user/のURLの後ろに何も入れないとNotFoundHttpExceptionのエラーが表示されます。

何も入れない場合も動作させるためには、?を使用して、$nameに初期値を設定すれば、正常に動作します。

Route::get('user/{name?}', function ($name='Jack' ) {
    return 'User '.$name ;});

複数のパラメータ

URLにたくさんのパラメータを与えたい時もあるかと思います。その時は、以下のように記述できます。

Route::get('posts/{post}/{comment}', function($postId,$comment){
    return 'postID:'.$postId.',comment:'.$comment;
});

www.yoursite.com/posts/1/testにアクセスすると postID:1,comment:testと出力されます。

パラメータの値のチェック

正規表現を使って、受け取るパラメータを制限することも可能です。 例えばユーザの名前に数字が入る人はいないと思うので、whereを利用してアルファベットだけに制限を行うために以下のように記述します。

Route::get('user/{name?}', function ($name='Jack' ) {
    return 'User '.$name ;})->where('name','[A-Za-z]+');

名前に数字を入れるとエラーが発生します。

名前付きルート(Named Route)

ルートグループ

  • ミドルウェア(middleware)
  • 名前空間(Namespaces
  • ルートプレフィックス

ルートモデルバインディング

  • Implicit Binding
  • Explicit Binding