Implicit Controllers は Laravel 5.2 で廃止になりました。
今回は、コントローラ内の全てのメソッドを1行のルート設定で簡単に定義できる、Implicit Controllers(暗黙コントローラ)を試してみます。
Routing
まずは、HogeControllerを作成します。–plainオプションを指定して中身が空のコントローラを作成します。
$ php artisan make:controller HogeController --plain
次に、routes.phpを以下のように編集します。
<?php // app/Http/routes.php ... Route::controller('hoge', 'HogeController'); // 追加
HogeControllerを Implicit Controllerとして定義しました。
Route::controller() の第1引数は、ベースとなるURIを指定します。第2引数はコントローラ名を指定します。
“/hoge/XXXX”にアクセスがあると、HogeControllerのXXXXメソッドがコールされます。
この段階で一旦 artisanコマンドでルートを確認してみます。
$ php artisan route:list
+--------+--------------------------------+--------------------------+------------------+---------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+--------------------------------+--------------------------+------------------+---------------------------------------------------+------------+ | | GET|HEAD|POST|PUT|PATCH|DELETE | hoge/{_missing} | | App\Http\Controllers\HogeController@missingMethod | | +--------+--------------------------------+--------------------------+------------------+---------------------------------------------------+------------+
※上記の表は hoge に絞って表示しています。
1つだけルートが定義されています。{_missing} はワイルドカードで、何が渡されても missingMethod()メソッドがコールされます。
missingMethod()は HogeControllerのスーパークラスである Illuminate\Routing\Controller の中で定義されています。
Controller
HogeControllerを以下のように編集します。
<?php // app/Http/Controllers/HogeController.php ... class HogeController extends Controller { public function getIndex() {} public function getCreate() {} public function postStore() {} public function getShow($id) {} public function getEdit($id) {} public function patchUpdate($id) {} public function deleteDestroy($id) {} public function noneRoutedMethod() {} // ルーティングされない }
ルーティングさせたいメソッドは、メソッド名をHTTPのメソッド名(get, post, put, patch, delete)で開始する必要があります。
この段階で artisanコマンドでルートを確認してみます。
$ php artisan route:list
+--------+--------------------------------+-----------------------------------------------------+------------------+---------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+--------------------------------+-----------------------------------------------------+------------------+---------------------------------------------------+------------+ | | GET|HEAD | hoge/index/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@getIndex | | | | GET|HEAD | hoge | | App\Http\Controllers\HogeController@getIndex | | | | GET|HEAD | hoge/create/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@getCreate | | | | POST | hoge/store/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@postStore | | | | GET|HEAD | hoge/show/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@getShow | | | | GET|HEAD | hoge/edit/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@getEdit | | | | PATCH | hoge/update/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@patchUpdate | | | | DELETE | hoge/destroy/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\HogeController@deleteDestroy | | | | GET|HEAD|POST|PUT|PATCH|DELETE | hoge/{_missing} | | App\Http\Controllers\HogeController@missingMethod | | +--------+--------------------------------+-----------------------------------------------------+------------------+---------------------------------------------------+------------+
※上記の表は hoge に絞って表示しています。
HogeController内のメソッドが、Implicit Controller機能によって、自動的にルーティングされました。
パラメータは1〜5まで任意で受け取れるようになっています。
noneRoutedMethod()はメソッド名がHTTPのメソッド名で始まっていないので、ルーティングされていないのが分かります。
※ HogeController.phpは説明の為に作成したので、ここで削除してください。
※ routes.php内の Route::controller(‘hoge’, ‘HogeController’); も、ここで削除してください。
まとめ
ルーティングで、Route::controllers を使うと、コントローラのメソッド名から自動的にルート設定を行うことができる。
この機能を Implicit Controllers(暗黙コントローラ)と言う。
公式サイト
http://laravel.com/docs/5.1/controllers#implicit-controllers