November 25, 2014

Laravel 5のルーティングのアノテーションを試してみた

この機能は廃止 https://github.com/laravel/framework/commit/4d9f92ef77b3610a05f71110f539daff06e9081d されたのかもしれません。

--

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