PHPでウェブアプリケーションを開発する場合、フルスクラッチで書くことはほとんどなくなり、なんらかのフレームワークを使うことが一般的になってきました。
API開発ももちろんそうで、色んなフレームワークでAPI開発を加速させる機能が実装されています。
今回は、PHPフレームワークの中でも人気があるLaravelを使ったAPI開発を見てみたいと思います。
目次
世界中で大人気のLaravel
Laravelは現在世界中で大人気のPHPフレームワークです。
その人気の理由は、とにかく使い勝手がよく、ユーザーフレンドリーなところ。
あらかじめWebシステムを構築する際に必要になってくるであろう機能が揃っているので、私達はそれらの機能を呼び出すだけでLaravelを使うメリットを享受できます。
Laravelを選択する理由はたくさんあって、すべては挙げられませんが、主なものを挙げると以下のような特長があります。
- 強力なコマンドがあらかじめ揃ったコマンドラインツール
- 柔軟な使い方ができるルーター機能
- クエリの結果をそのままレスポンスにできるORM
- セキュリティ対策が読み込みだけでできるミドルウェア
- デフォルト装備のAWSサービス連携機能
これだけでも十分試してみる価値はありますが、コントローラー処理をコントローラーファイルに書いたりルーターに直接書いたりと、フレームワークに縛られない書き方ができるので、他のフレームワークを使った経験を活かすことができます。
また、他のフレームワークを使ったことがあれば理解しやすい構造にもなっています。
Laravel導入方法
インストールもcomposerを使えば、コマンドラインから一行で完了します。
composer create-project laravel/laravel [プロジェクト名] --prefer-dist
オープンソースで開発が進められていて、githubにソースが公開されているので、composerがインストールされていない環境であれば、git cloneコマンドや、zipファイルをダウンロードしてきて展開するといった方法で導入することも可能です。
LaravelでAPIを高速開発するには
Laravelには開発速度を上げるための機能がたくさんありますが、その中でもAPI開発に効く機能をご紹介します。
artisan
Laravelにはartisanというコマンドライン用のツールが付属していて、artisanを使えばRESTfulなAPIが簡単に作成できます。
artisanは、Laravelをインストールしたディレクトリ直下に存在していて、これ自体もPHPで書かれています。
php artisan make:controller PhotoController -r
上記のコマンドで「app/Http/Controllers/PhotoController.php」が作られます。
また、「-r(–resourceのショートオプション)」オプションの効果でコントローラーファイルにはスタブメソッドが7つ定義されます。
あとはスタブに処理を追加していけば完成、といった具合です。
ルーター
ルーター自体はURLや対応するHTTPメソッドを定義するフレームワークでは基本的な機能ですが、Laravelのルーターはかなり柔軟な使い方ができる印象です。
例えば、コントローラー単位で指定して、それに書かれている複数のアクションを一気に登録することができたり、小規模なシステムの場合細かいアクションを作るためにファイルをたくさん作る必要はなく、まるでマイクロフレームワークのように全てのアクションをルーター内に無名関数(公式ドキュメントではクロージャ。匿名関数とも)で定義してしまったり、システムの規模や好みに応じた柔軟な作り方ができるのがLaravelのルーターの魅力ではないかと思います。
Route::resource('photo', 'PhotoController');
とりあえずコントローラーを指定して、公開したいアクションだけをホワイトリスト方式で書き出すことができます。
Route::resource('photo', 'PhotoController', [ 'only' => [ 'index', 'show' ] ]);
逆に、公開したくないアクションを指定することもできます。
Route::resource('photo', 'PhotoController', [ 'expect' => [ 'destroy' ] ]);
もちろん、1つずつコントローラーを書いていくこともできます。
Route::get('photo/{id}', 'PhotoController@showProfile'); Route::post('photo/{id}', 'PhotoController@editProfile');
ルーター内にアクションを押し込んで、手早く実装してしまうこともできます。
Route::get('photo', function () { // なんらかの処理 return $data; })
API開発用には更に便利な機能が用意されていて、routesディレクトリ直下にapi.phpというファイルを設置すれば、URLのドメインの後に「/api」というプレフィックスが自動的に付けられ、通常のウェブページとAPIが分離される仕組みになっています。
ウェブページとAPIの設定ファイルの分離もできて一石二鳥です。
APIと管理ツールのソースを共存させることも簡単にできてしまいます。
また、APIでのデータ受け渡しはJSONで行うことが多くなってきましたが、コントローラーやRouteクラスの戻り値が配列なら、自動的にJSONに書き換える機能を標準で持っているため、ビューやコントローラーの終了処理にjson_encodeを仕込む必要もありません。
Laravelを利用するデメリット
既成の処理が多く組み込まれていて、実装が爆速になると言われるLaravelですが、ひとつだけ大きなデメリットとして、その処理速度があります。
Laravel5.3のベンチマークになりますが、著名なPHPフレームワークのベンチマーク結果によると、Laravelは22フレームワーク中22位という結果です。
日本ではPHPフレームワークの代名詞ともなっているCakePHPとくらべても60%程度の速度になっています。
多機能が故のデメリットなので、初期開発はLaravelで実装し、負荷が高くなったタイミングで別のフレームワーク、もしくはプログラム言語でリプレイスすることも視野に入れておいた方がよいかもしれません。
まとめ
とにかくユーザーフレンドリー、多機能なPHPフレームワーク、Laravelを紹介しました。
使い心地は抜群で、慣れてしまったら他のフレームワークが不親切に感じるほど手に馴染む感覚を楽しんでもらえると思います。
API開発を高速に進める道具としては、まずartisanの使い方を覚えてしまうのが近道かなと思います。
コントローラーファイルやスタブメソッドを一気に作れてしまいますし、今回はご紹介できませんでしたがモデルやビューファイルの作成やマイグレーションももちろんできます。
ジョブキューによるバッチ処理の開発なども、使う価値がある機能だと思いますのでぜひ使ってみてください。
Laravelを利用するデメリットも挙げましたが開発速度とのトレードオフですし、クラウドで展開するならAPIサーバーのスケールアップやスケールアウトで急場をしのぐ運用も取れます。
また、AWS(アマゾン ウェブ サービス)が簡単に利用できるライブラリもデフォルトで入っているため、AWSを使った運用とは相性抜群です。
至れり尽くせりとも言えるくらい高機能なLaravelで、爆速API開発もいいですね。
次回、API開発に便利なPHPフレームワーク(2)では、作成したアプリケーションの実行速度が爆速になる魔法のようなフレームワーク「Phalcon」をご紹介します。