--
Laravel 5は現在開発中です。正式リリース版では、当記事の内容と異なる可能性があります。
Laravel 4ではルーティングをroutes.phpで定義しますが、Laravel 5からはコントローラのアノテーションでも定義できるようになります。
細かな書き方などは、以下がとても参考になりました。
http://mattstauffer.co/blog/laravel-5.0-route-annotations
以下、簡単に試してみました。
コントローラを適当に作成します。
$ php artisan make:controller FooController --plainメソッドとアノテーションを適当に書いてみます。
app/Http/Controllers/FooController.php
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class FooController extends Controller {
/**
* @Get("foo/{id}", as="foo.get")
*/
public function getExample($id)
{
//
}
/**
* @Post("foo/{id}", as="foo.post")
*/
public function postExample($id)
{
//
}
}
app/Providers/RouteServiceProvider.php を編集して protected $scan をオーバーライドします。値は配列で、アノテーションをスキャンしたいコントローラ名を書き並べます。
class RouteServiceProvider extends ServiceProvider {
protected $scan = [
'\App\Http\Controllers\FooController',
];
php artisan route:scan コマンドでスキャンします。
$ php artisan route:scan Routes scanned!php artisan route:list コマンドで確認してみます。
$ php artisan route:list
+--------+-------------------+----------+------------------------------------------------+------------+
| Domain | URI | Name | Action | Middleware |
+--------+-------------------+----------+------------------------------------------------+------------+
| | GET|HEAD foo/{id} | foo.get | App\Http\Controllers\FooController@getExample | |
| | POST foo/{id} | foo.post | App\Http\Controllers\FooController@postExample | |
+--------+-------------------+----------+------------------------------------------------+------------+
正しくスキャンされたようです。尚、スキャン内容は storage/framework/routes.scanned.php に保存されていました。
routes.php で同様の定義をするなら以下です。
$router->get('foo/{id}', ['as' => 'foo.get', 'uses' => 'FooController@getExample']);
$router->post('foo/{id}', ['as' => 'foo.post', 'uses' => 'FooController@postExample']);
また、app/Providers/RouteServiceProvider.php の protected $scanWhenLocal をオーバーライドしてtrueを設定すると、環境値が"local"の場合に限って、リクエストの度に自動スキャンしてくれるようになりました。
protected $scanWhenLocal = true;
routes.phpはどうしても肥大化しやすく、その点は解消しそうな気がします。参考記事を見ると @Where で正規表現によるマッチングにも対応しているようですね。更に、アノテーションはメソッドに対してだけでなく、コントローラに対しても書けるようで
@Resource
@Controller
等も記載されています。
ただ、routes.phpに書くと、before/afterフィルタ(Laravel 5ではMiddlewareという仕組みに置き換わります。)が一目瞭然で、その辺りで好き嫌いが別れそうな印象を受けました。また、アノテーション式だと、デプロイ時のスキャン忘れや、DB値を用いた動的なルーティングを定義する際などに注意が必要かもしれません。
最後に、Laravel 5ではルーティングのキャッシュが可能です。
$ php artisan route:cacheこれは、routes.php式にもアノテーション式にも対応していました。キャッシュ内容は(少なくとも今現在は) config/cache.phpのdriver値に関わらず storage/framework/routes.php に保存されるようです。
No comments:
Post a Comment