実践Laravel 基本編6 コントローラーとルーティング2

Posted: 2014-06-03 01:01 |  laravel 
コントローラーとルーティング1の続きです。

■namespace指定とグループ化

おそらく単体ではあまり使用する機会がない思いますが、
後述するグループとともに使用する事が多いはずです。
それぞれのcontrollerを実装していくにあたり、
機能ごとにディレクトリ分けや、namespaceで分けていくと思いますが、
その記述をルーティングのグループ化で使用し、簡潔に記述します。
一つのドメイン、もしくは複数のドメインを管理しているルーターで、
下記のようにグループをせずに記述すると・・・
// 
\Route::post('administrator/login', "Application\Administrator\AuthenticateController@postLogin");
\Route::post('administrator/logout', "Application\Administrator\AuthenticateController@postLogout");
\Route::get('administrator/menu', "Application\Administrator\HomeController@showMenu");
// 
\Route::get('administrator/user/{user_id?}', "Application\Administrator\UserController@showUser");
\Route::post('administrator/user/confirm', "Application\Administrator\UserController@postUserConfirm");
\Route::post('administrator/user/apply', "Application\Administrator\UserController@postUserApply");
ログインと、ユーザー情報作成は同じ名前空間を使用して、管理系の実装なんだろうなと想像はつくかと思いますが、
小さなアプリケーションであればこの様な記述でも特に気にする事はないかもしれませんが、
大きなアプリケーションになると、これが数百行にわたって記述される事になります。
もしかすると頭痛の原因になるかもしれませんね!
ではnamespaceとグループ化を使って、ほんの少しだけわかりやすくしてみましょう。
// group
\Route::group(['namespace' => 'Application\Administrator', 'prefix' => 'administrator'], function(){
    //
    \Route::post('login', "AuthenticateController@postLogin");
    \Route::post('logout', "AuthenticateController@postLogout");

    \Route::get('menu', "HomeController@showMenu");
});
groupでnamespaceとprefixを指定し、
無名関数の中に、関連付けたいコントローラーなどを記述します。
目視で分かりやすいグループ化です。
グループの無名関数の中に記述したものは、すべて引き継がれるようになります。
例えばフィルターを処理を指定する場合、
この例では、login以外は必ずユーザーがログインしている必要がありますので、
login以外にauth.basicフィルターをかけたい場合は、以下のようになります。
// group
\Route::group(['namespace' => 'Application\Administrator', 'prefix' => 'administrator'], function(){
    //
    \Route::post('login', "AuthenticateController@postLogin");
    //
    \Route::group(['before' => 'auth.basic'], function(){
        \Route::post('logout', "AuthenticateController@postLogout");
        \Route::get('menu', "HomeController@showMenu");
    });
});
グループ内にグループでフィルターを指定しました。
このように、グループ化してどんどんまとめていく事ができます。
では、さらにもっと簡略化していきます。

■controller記述

ルーターにはGET, POST, PUT, PATCH, DELETE, anyなど、コントローラーの記述方法で簡単に指定する事ができます。
それは、HTTPメソッドをプレフィックスにしたメソッドにする です。
コントローラーで下記のようにした場合、
namespace Application\Administrator;

class UserController extends \BaseController
{

    public function getForm($id)
    {

    }

    public function postConfirm()
    {

    }

    public function postApply()
    {

    }

    public function getList()
    {
        
    }
}
次の様な指定方法で、簡単にルーティングを作成する事ができます。
\Route::controller('user', 'UserController');
これだけで
GET|HEAD administrator/user/form/
POST administrator/user/confirm/
POST administrator/user/apply/
GET|HEAD administrator/user/list/

この様なルーティングが生成されます。
各メソッドに名前を付けたい場合は、以下のようになります。
    \Route::controller('user', 'UserController', [
            'getForm' => 'admin.user.form',
            'postConfirm' => 'admin.user.confirm',
            'postApply' => 'admin.user.apply',
            'getList' => 'admin.user.list'
        ]);
もちろん\Route::controllerもグループと組み合わせて使用しても問題ありません。
さらにRESTfulな実装が簡単にできる記述方法もあります。

■リソースコントローラー

これを利用する場合は、コマンドから作成した方が簡単です(コマンドじゃなくても一応作れます。)
artisanコマンドでコントローラーを作成するには以下の様なコマンドになります。
$ php artisan controller:make AcmeController
主に使用するオプションは下記のものでしょうか
--only                自動生成するメソッドを指定する
--except            自動生成されるメソッドから除外するメソッド
--path               出力されるディレクトリ
オプションを指定しない場合は、app/controllers配下に作成されます。
また自動生成されるコントローラーに記述されるメソッドは以下のようになります。

 
HTTPメソッド Path method Route Name
GET /uri名 index resource.index
GET /uri名/create create resource.create
POST /uri名 store resource.store
GET /uri名/{resource} show resource.show
GET /uri名/{resource}/edit edit resource.edit
PUT/PATCH /uri名/{resource} update resource.update
DELETE /uri名/{resource} destroy resource.destroy

また、Routeへの記述方法はこのようになります。
\Route::resource('acme', 'AcmeController');
生成時にonlyとexceptを指定せず、実装時に不要なものを除外したい場合等は
// 一部だけ使用したい
Route::resource('acme', 'AcmeController', ['only' => ['index', 'show']]);
// 除外したいものを指定
Route::resource('acme', 'AcmeController', ['except' => ['create', 'store', 'update', 'destroy']]);
という様な指定になります。
こうする事で不要なURIのアクセスなどを防ぐ事ができます。
第三引数の配列はこれまで述べてきたoptionの指定が可能です。
ただし、4.1.29の時点では\Route::resourceを用いた指定は、
get, post,put patch, delete、controllerなどの後に記述する必要があります。
おそらく後に修正されるとは思いますが、これに従わない場合は他のルーティングが正しく動かない場合がありますので
注意してください。

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014