Laravel5とアノテーション

Posted: 2014-10-31 00:12 |  laravel PHP全般 

今年もあと2ヶ月で終わりますね、早い

年内リリースされると思われるLaravelの次期バージョンの5について、
恐らくもうあまり変わらないだろうと思われる機能を先取りしてみましょう

まずはさらっと前提知識として覚えておきましょう

4系とは違ってサービスプロバイダーやミドルウェア(フィルターなど)が前面に出た構成になり、
より自由にユーザーが使いたいものを組み合わせる事が簡単になりました。
これにより、これまでアピールポイントの一つだったファサード(と云う名のプロキシー)が
影を潜めバインディングなどコンテナの機能が拡張され、普通の書き方に近づいた印象です
もちろんこれまで通りファサードを用いて簡単に実装するのもこれまで通り可能です!
ルーティングもこれに倣う形で少し記述方法が変更されました。

そうです

javaの方やSymfony, BEAR.Sunday利用の方にはおなじみのアノテーションがLaravelでも導入され、
コントローラー、ルーティングで活用される様になりました。
が、これまで通りのルーティングの記述方法が削除された訳ではありません。

5でびっくりしないように、アノテーションが苦手な方もいると思いますので、
まずはこれまで通りのルーティングの指定方法です。
前のdevelopのリポジトリにはあった気がしたんですが、おなじみroutes.phpが削除されました

が、

デフォルトではApp\Providers\RouteServiceProviderがルーティングのサービスプロバイダーにあたり、
その中の
/**
 * Define the routes for the application.
 * @param  \Illuminate\Routing\Router  $router
 * @return void
 */
public function map(Router $router)
{
    // require app_path('Http/routes.php');
}
を利用します
コメントアウトを外せばこれでもういつも通り!ファイルの場所はどこに置いても構いません
好きなとこで記述しましょう
いままで通り、
\Route::get('/hello', function() {

    }
);
ファサードを用いて記述する事も出来ますが、
map()はメソッドインジェクションで\Illuminate\Routing\Routerが引数として与えられています
requireするroutes.php $routerでインスタンスにアクセスする事ができ、
何が嬉しいのかというと、IDEの補完が効く様になりました(スバラシイ!)
phpstormなどをお使いの方はこんな感じで書くでしょう
/**  @var \Illuminate\Routing\Router  $router */
$router->get('/hello', function() {

    }
);

これで安心です。
ちなみにルーティングの$router->controller()は削除されました。
より自由にルーティングを簡単に作れる様になったから、でしょうか

では次にアノテーション

Laravel5のアノテーションは、それだけでなにか特別な事が起こる訳ではありません

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;

class HomeController extends Controller
{

    /**
     * @Get("/")
     */
    public function index()
    {
        return view('hello');
    }

    /**
     * @Post("/")
     */
    public function update()
    {
        return view('hoge');
    }

}

ルーティングで利用するメソッドにアノテーションを記述します
これまで通りGet, Post, Put, Patch, Delete, Optionsが利用できます
名前空間のIlluminate\Routing\Annotations\を見ると、ルーティングで利用できるアノテーションがわかります
いまのところ Get, Post, Put, Patch, Delete, Optionsで指定できるものは、
URI、domain、as、middleware、whereです
Getリクエストで、URIは"/"、ミドルウェアにguest(認証していない人のみ)
別名を"index" という指定は下記の様になります
 

    /**
     * @Get("/", as="index", middleware={"guest"})
     */
    public function index()
    {
        return view('hello');
    }

ミドルウェアは複数指定できますので、配列で指定しますが、
アノテーションの場合は、{}内に カンマつなぎで記述します
くわしくはdoctrin/annotationを参考にして下さい

@Target({"METHOD","PROPERTY"})

ほかにも

    /**
     * @Get("/hoge/{id}", where={"id": "[0-9]+"})
     */
    public function update($id)
    {
        return view('hoge');
    }

idを引数に利用しidは数字でなければいけない、という場合は上記の様になります

$ php artisan route:list
$ php artisan route:scan

でアノテーションを解析してルーティングのファイルを配置して完成です。
アノテーションを利用しないルーティングと、アノテーションを利用したアノテーションは併用する事が出来ます
が、アノテーション利用が優先されます
他にも@Controller, @Resourceもありますが、それはまた次回

ちなみにphpstormでアノテーションの補完が出来ます
PHP Annotations

Symfony2 Plugin
を導入するといいです

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