みなさん、こんにちは。Golangを使ったチャットサービスを作ってみたいなーと思っているt-odaです。

今回は、タスクの一覧表示、作成に関するコントローラーとミドルウェアについてです。前回はAuthControllerについて解説しましたが、タスクのコントローラーも同じようにRoutes.phpの肥大化を防ぐためでもあります。

コントローラーの作成

まずはコントローラーを作成するところからです。これまたコマンドが用意されています。Laravelはほんとにコマンドが豊富で楽ですね。

次のコマンドを実行してコントローラーのファイルを作成しましょう。

$ php artisan make:controller TaskController --plain

--plainというオプションをつけることで中身が空のコントローラーファイルが作成されます。今回はこのファイルにメソッドを記述していきます。

ちなみにオプションなしでコントローラーファイルを作成すると、RESTfulなWebアプリケーションで実装するために必要な機能であるCRUDを想定したアクションメソッドがあらかじめ記述されています。ですが今回は使いません。

ルーティング

さて、コントローラーファイルが出来ればルーティングをしましょう。

ルーティングは初心者の時と変わりませんね。しかし、処理はコントローラーに書きます。Routes.phpはあくまでルーティングに関することを書くことで可読性の向上が見込めます。

タスクコントローラー

コントローラーの処理(ロジック)

  • 一覧表示
  • 作成
  • 削除

これに加え、コンストラクタでミドルウェアを設定します。第2回AuthControllerでも使っていましたね。

コンストラクタは新しいオブジェクトが生成されると一番最初に実行されるメソッドです。このコンストラクタにログインしているかどうかを判断するミドルウェアを設定することで、ログインしている人だけがタスクコントローラーのメソッドを実行できるということになります。

このミドルウェアはすでに用意されているものを利用します。また、ミドルウェアは/app/Http/Middlewareディレクトリにまとめられます。コマンドでミドルウェアを作成した場合もここに作成されます。

そして、ミドルウェアの登録は/app/Http/Kernel.phpで行います。

$middlewareはLaravelが起動した時点で実行されるミドルウェアになります。一方で、$routeMiddlewareは各ルートで呼ばれたときに実行されるミドルウェアになります。

ですので、Routes.phpやコントローラーファイルのコンストラクタで実行するミドルウェアは$routeMiddlewareに登録します。また、自分で作ったミドルウェアをどちらに登録するかは使い方次第になります。アプリケーション全体にかけたい場合は$middlewareに、部分的にかけたい場合は$routeMiddlewareに登録しましょう。

登録方法は配列のキーに名前、値にクラスを指定します。ミドルウェアはこのキーを指定することになるので名前はわかりやすい名前を付けましょう。

今回はこのうちAuthというミドルウェアを使います。Authはエイリアスのようなもので、実態はApp/Http/Middleware/Authenticate.phpになります。

タスクコントローラーはログインしている状態で動くことが前提になりますので、ログインしていない人がアクセスした場合はリダイレクトさせるという処理になっています。

続いて、TaskController.phpです。

$this->middleware()で簡単にミドルウェアが実装できるのとても簡単ですね。

次はタスクの処理に関するメソッドです。まずは一覧表示です。ビューは初心者向けの使いまわしです。また、モデルをインポートしておきましょう。

ログインしているユーザーのIDを検索条件としてタスクを取得しています。

Eloquentのwhere()でSQLのwhere句を生成し、get()で取得しています。戻り値はcollectionになります。あとはビューに渡して、ビュー側でループ処理を書けば表示は完成です。

表示ができれば作成の処理です。まずはバリデーションです。

初心者向けで書いた時と違ってますね。作成したコントローラーファイルは必ず親クラスとなるControllerクラスを継承しています。このクラスがバリデーションに関するトレイトを取り込んでおり、validate()が利用できるようになります。

このメソッドはとても簡単にバリデーションを行えるようになっており、リクエストとルールを指定するだけでいいのです。バリデーションに失敗した時のリダイレクト処理も書く必要はなくなっています。

  • $this->validate()の第1引数:リクエスト
  • $this->validate()の第2引数:ルール

バリデーションが出来れば登録の処理です。初心者向けの時と違う点がひとつあります。

それは作成するタスクに外部キーとしてuser_idも登録することです。

当然のことながら登録するuser_idはログインしているユーザーのidになります。つまり、関連するモデルの外部キーをプロパティに設定するということです。

前回はリレーションについて書きましたね。それがここで活きてきます。まずは、$request->user()で現在ログインしているUserモデルを取得しています。チェーンメソッドでtasks()とすることでリレーションを利用しています。これで、現在ログインしているユーザーのIDが指定したタスクのuser_idに設定されました。

そして、チェーンメソッドでcreate()を実行すれば登録処理は完成です。登録が終わればちゃんとで一覧ページにリダイレクトさせましょう。

次回予告

ということで今回は リレーションを加えた一覧表示と登録処理についてでしたが、いかがでしたか?個人的な感想ですが、僕は簡単かつスマートで好きです。

次回はこの処理を大幅に変更します(公式がこうなっているんで) 。小さなアプリケーションだと問題ないですが、規模が多くなると毎回このような処理を書いていては効率が悪いです。なのでTaskモデルの全アクセスロジックを持つリポジトリーを作ります。そしてこのリポジトリーを依存注入することでより簡単に記述することができ、またロジックを一元管理することもできます。