Laravel5のページ作り(いろいろ)

いろいろなルーティングの方法があって、ここらがLaravel5というかフレームワークの真髄かなと。
Lravel5の最初の1ページの理解ができたら、ここらは殆どその応用みたいなものなのでそんな難しいもんじゃないです。
httpの難しい話になると、GET,POST,PUT,DELETEということになりますが、正直開発している人間として言わせてもらうとPUTとDELETEは基本的なルーティングにあるようなRoute::put, Route::deleteは正直使った試しがありません。いわゆる動詞として100%使うのが、

Route::get();
Route::post();

の2つになります。なのでここだけ詳しくやります。

  • ルーティングにパラメータを渡す

ルーティングにパラメータを渡す

例によってルーティングの記述をこんな感じにします。

//[routes/web.php]
Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

/user/[適当な文字列]でアクセスすると「User [適当な文字列]」を表示してくれます。これはシリーズもののページやDBをつかった複数のページの管理に非常によく役立ちます。というかこれがフレームワークの肝です。
いわゆるパーマリンクという概念はここらで作成されているものと思ってください。Wordpressとかも内部で似たようなことを行っております。
ここではクロージャで直接ページを返してしまいましたが、viewやcontrollerをかませるとこれまたいろんな処理ができます。というかこれが肝です。

ルーティングパラメータをコントローラとビューに渡す

さて、コントローラとビューの接続はもうできるものとしてすすめると、ルーティング側からは、

//[routes/web.php]
Route::get('users/{id}', 'UserController@page');

という感じでidをコントローラに渡します。(直感的にUserController@page($id)とならないことに注意しましょう。)Laravelでは@以降はメソッド名を明記するのみで引数をとらないみたいです。引数自体はコントローラ内の実際のメソッドで指定するということでOK。
コントローラはルーティングで指定したコントローラとメソッドを準備します。

//[app/Http/Controllers/UsersController.php]
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;

class UsersController extends Controller
{
    /**
     * 指定ユーザーのプロフィール表示
     *
     * @param  int  $id
     * @return Response
     */ 
    public function page($id)
    {
//      echo $id;
        return view('users/page')->with('id',$id);
    }

ここにpageメソッドがあるわけですが、ここでルーティングで指定した{id}を受け取ります。
テンプレートを作成する前にechoしてみるとidの値を受け取っていることがわかると思います。受け取った変数をテンプレートへ送るにはcompactとwithの2つの方法がありますが、私は個人的にwith派です。
さて最後にビューのテンプレートですが、{{$id}}で受け取ります。これはbladeの使い方ですね。

<!-- [resources/views/users/page.blade.php] -->
users/{{$id}}

これで/users/xxxxxとアクセスすると/users/xxxxxが表示できるようになります。

パラメータはコントローラ内でそれなりのバリデーションを独自に作成するか、またはルーティングそのものを正規表現でやったりといろいろな方法があります。そこは設計の見せどころでもあり個性が出て来るところなので割愛。

コントローラをディレクトリでわける

長らくプログラムやっている人なんかは直感的にわかってしまってどうでもよいことなんですが、コントローラをディレクトリでわける際には、ルーティング側の区切りはスラッシュじゃなくてバックしラッシュです。(エラーコードみればわかります。)

//[routes/web.php]
Route::get('users/{id}', 'Member\UserController@page');

という風に書いた場合、コントローラは、

app/HTTP/Contorollers/Member/UserController.php

となります。コマンドだと、

php artisan make:controller Member/UserController

どこでバックスラッシュで、どこでスラッシュかというと、namespaceまわりはバックスラッシュで、物理的なパスはスラッシュになるといったところです。


基本的なルーティング
Laravelのルーティング書き方まとめ

Last update: 2017.08.02 (水)