Laravel4のコントローラ

今日は、Laravel4のコントローラについて調べてみたいと思います。

コントローラの命名規則

1. まず一番最初に覚えなければならないのが、命名規則の変更でしょう。Laravel3では、クラス名はアンダーバーを使用していましたが、Laravel4では、PSR-1準拠のため、キャメル記法になります。

2. それでは、同じコードをLaravel3とLaravel4で比較してみます。

3. Laravel3の場合

laravel3/application/controllers/user.php

Class User_Controller extends Base_Controller{
 public function action_index(){
 echo 'Topページです';
 }

4. Laravel4の場合

Laravel4/app/controllers/UserController.php

Class UserController extends BaseController{
 public function showIndex()
 {
 echo 'Topページです';
 }
  • ファイル名がuser.phpからUserController.phpに変更になっています。コントローラのファイル名にはControllerがつくようになっています。
  • クラス名も同様にキャメル記法ですので、User_ControllerがUserControllerになりました。
  • アクションメソッドからaction名が消えました。

コントローラのルーティング

5. Laravel3はコントローラをルーティングするには、下記のように記述するだけでした。

laravel3/application/routes.php

Route::controller('user');

6. Laravel4では、コントローラアクションに対してルーティングを指定します。

laravel4/app/routes.php

Route::get('user','UserController@showIndex');

7. これで、http://localhost/laravel4/public/userとブラウザからアクセすると、『Topページです』の文字が表示されるようになります。

基本的なコントローラ

8. すべてのコントローラーはBaseControllerクラスを拡張する必要があります。BaseControllerはフレームワークのControllerクラスを拡張しています。上記でも述べたようにコントローラアクションに対し、ルートを定義することが出来ます。

Route::get('user/{id}','UserController@showProfile');

9.  また、PHP名前空間で体系づけられたコントローラを採用しているなら、完全なクラス名をルートに指定することが出来ます。

Route::get('foo','Namespace\FooController@medhod');

10. コントローラルートに名前をつけることも出来ます。

Route::get('foo',array('uses'=>'FooController@method',
 'as'=>'name'));

コントローラフィルター

10. 『普通』のルートと同じようにコントローラにフィルターを指定することが出来ます。

Route::get('profile',array('before'=>'auth',
 'uses'=>'UserController@showProfile'));

11. また、コントローラ内部でフィルターを指定したり、無名関数を使用しインラインでコントローラフィルターを指定することも出来ます。尚、この辺は、ドキュメントの丸写しとなりそうなので、ドキュメントを参照してください。

RESTフルコントローラー

12. Laravel4では、REST命名規則を使ったコントローラアクションへのルートを定義一つだけで簡単に行うことが出来ます。最初にRoute::controllerメソッドを使用して、ルートを定義します。

Route::controller('users','UserController');

13. controllerメソッドの第1引数は、コントローラが処理するベースのURIで、第2引数は、コントローラのクラス名を指定します。そして対応するHTTP変数名をプレフィックスに使用したコントローラメソッドを呼び出すことが出来ます。

14. それでは、UserControllerを下記のように修正します。

<?php
 class UserController extends BaseController{
 public function showIndex()
 {
 echo 'Topページです';
 }
 public function getIndex()
 {
 echo 'getIndexです';
 }
 public function getProfile()
 {
 echo 'getProfileです';
 }
 }

15. それでは、ブラウザでアクセスしてみましょう。まず、最初は、showIndexを実行します。

http://localhost/laravel4/public/user

laravel4_021

16. 続いてgetIndexを実行します。

http://localhost/laravel4/public/users

laravel4_022

17. 最後にgetProfileを実行します。

http://localhost/laravel4/public/users/profile

laravel4_023

リソースフルコントローラ

18. リソースフルコントローラは、リソースに関するRESTフルコントローラを簡単にしてくれます。そしてArtisanコマンドラインで、create:makeを実行し、Route::resouceメソッドでルートを定義すれば、そのようなコントローラを素早く生成できるようです。

19. それでは、コマンドラインから下記を実行します。

php artisan controller:make PhotoController

laravel4_024

20. そしてそのコントローラーをリソースフルなルートとして登録します。

Route::resource('photo','PhotoController');

21. それでは、Artisanコマンドで作成されたPhotoController.phpを見てみましょう。下記のように7つのアクションが作成されています。

<?php

class PhotoController extends BaseController {
    public function index()
    {
        //
    }
    public function create()
    {
        //
    }
    public function store()
    {
        //
    }
    public function show($id)
    {
        //
    }
    public function edit($id)
    {
        //
    }
    public function update($id)
    {
        //
    }
    public function destroy($id)
    {
        //
    }

}

リソースフルコントローラにより処理されるアクション

22. 上記の7つのアクションの処理方法を調べてみましょう。

23. まず、indexアクションです。これは特に問題が無いと思いますが、GETにより処理されます。下記のように修正します。

public function index()
 {
return 'Indexアクションです';
 }

24. ブラウザに下記のようにアドレスを入力します。

http://localhost/laravel4/public/photo/

laravel4_025

尚、photo/indexと入力しても何も表示されませんので、注意してください。というよりも、photo/の後に文字列(createを除く)または、数値を入力すると、後から調べるshowアクションとして処理されます。

25. 次にcreateアクションです。これもGETにより処理されます。下記のように修正します。

public function create()
 {
 return 'createアクションです。';
 }

26. ブラウザに下記のように入力します。

http://localhost/laravel4/public/photo/create

laravel4_026

27. その次のstoreアクションですが、POSTにより処理されます。POSTで、http://localhost/laravel4/public/photoにアクセスすると、storeアクションが処理されます。

28. 次にshowアクションを調べてみます。下記のようにコードを修正します。

public function show($id)
 {
 return 'show'.$id.'アクションです。';
 }

29. ブラウザで下記のように入力してみましょう。

http://localhost/laravel4/public/photo/15

laravel4_027

これも、photo/show/15ではないことに注意してください。

30. その次のeditアクションについて調べてみます。editアクションはGETにより処理されますが、ちょっと面白い記述方法をとっています。editアクションを下記のように修正します。

public function edit($id)
 {
 return 'edit'.$id.'アクションです。';
 }

31. そしてブラウザでのアクセス方法ですが、下記のようにアクセスします。

http://localhost/laravel4/public/photo/15/edit

laravel4_028

考え方としては、先ほどのshowアクションが、URIにeditが付与されることによりeditアクションとして認識されると考えればいいのかなと思います。

32. そして最後にupdateアクションと、destoryアクションですが、updateアクションがPUTまたは、PATCH変数により処理され、desotroyアクションは、DELETE変数により処理されます。考え方が正しいかどうかはさておいて、これもshowアクションがPUT/PATCHの場合は、updateアクション、DELETEの場合はdestroyアクションとして認識されると覚えておけばいいと思います。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ