--
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