2013/12/19
FuelPHP Advent Calendar 2013 の 19 日目です。昨日は、@madmamor さんの「FuelPHPとMongoDBとTraceKitでJavaScriptのエラー情報を収集してみる」でした。
API を作る機会が増えていますよね。スマホアプリから叩いたり、Javascript のフレームワークから叩いたりと。
あなたも私も、いきなり誰かに「私、API が叩きたいの♥」と言われるかも知れません。
ということで、いつそうなってもいいように、FuelPHP で API を実装する流れをおさらいしておきましょう。
FuelPHP には Controller_Rest というものが用意されていて、API を作るのがとても簡単なんですよー、とはよく言われるところですが、実際にどれぐらい簡単なのかやってみました。
結果は、FuelPHP のインストールも含めて、4 分 44 秒で実装できました。
以下、詳しく説明します。
今回は、下記環境での実装例となります。
root、データベース名は fuel_dev(FuelPHP インストール時のdevelopment環境でのデフォルト設定です)では、はじめましょう。
あらかじめ、fuel_dev という名前のデータベースを作っておきます。
$ echo 'create database fuel_dev' | mysql -u root -proot
oilコマンドでさくっと行きましょう。参考)http://fuelphp.com/docs/
$ curl get.fuelphp.com/oil | sh $ cd Sites/ $ oil create api
できたら、そのディレクトリへ移動。
$ cd api
一応念のため、動くか確認しておきましょう。ビルトインサーバ使います。
$ php -S localhost:8000 -t public
はいこんにちは。
今回は、簡単なメモみたいなのを作りましょう。メモを記録したり、取得したりするだけのもの。
という2つの URL を用意して、それぞれ、メモの投稿と取得をさせたいと思います。
では、進みましょう。
oil generate でモデル作ります。
$ php oil generate model memo memo:varchar created_at:timestamp updated_at:timestamp --mysql-timestamp --crud --created-at --updated-at
僕の好みで、--crud --mysql-timestamp --created-at --updated-atオプションをつけてます。
Creating model: /Users/omoon/Documents/api/fuel/app/classes/model/memo.php
Creating migration: /Users/omoon/Documents/api/fuel/app/migrations/001_create_memos.php
とメッセージが表示されて、model と同時にマイグレーションファイルも作成されていることが分かります。
忘れないうちに、そのまま oil r migrate して、テーブルを作成してしまいましょう。
% php oil r migrate Performed migrations for app:default: 001_create_memos
続いて、fuel/app/config/route.php を下記のように編集します。
// fuel/app/config/route.php
return array(
'_root_' => 'welcome/index', // The default route
'_404_' => 'welcome/404', // The main 404 route
'memo/read' => 'memo/read',
'memo/write' => 'memo/write',
);
これで、
この2つのURLへアクセスできるようになります。
上記で設定したルーティングに合わせてコントローラを作りましょう。
FuelPHP では、あらかじめ用意されている Controller_Rest を継承して作ります。ここがキモですね。
ここもoil generateでさくっと行きたいところですが、ざっと見た感じでは、Controller_Rest 用のオプションなどがあまり用意されていないようでしたので、ある程度まで作ってちょこっと修正する方針で行きます。
$ php oil generate controller memo write read --extends=Controller_Rest
これで、fuel/app/classes/controller/memo.php に下記のようなファイルができあがりますので、
class Controller_Memo extends Controller_Rest
{
public function action_read()
{
$data["subnav"] = array('read'=> 'active' );
$this->template->title = 'Memo » Read';
$this->template->content = View::forge('memo/read', $data);
}
public function action_write()
{
$data["subnav"] = array('write'=> 'active' );
$this->template->title = 'Memo » Write';
$this->template->content = View::forge('memo/write', $data);
}
}
このように編集します。
class Controller_Memo extends Controller_Rest
{
protected $format = 'json';
public function get_read()
{
$memos = Model_Memo::find_all();
$this->response($memos);
}
public function post_write()
{
$memo = Input::post('memo');
Model_Memo::forge(['memo' => $memo])->save();
}
}
ポイントは、
protected $format = 'json'; でデフォルトフォーマットを JSON にpublic function get_read() で readを GET メソッドで受け付けるようにpublic function post_write() で writeを POST メソッドで受け付けるように各メソッドでは、今回は単純にModel_Memo::find_all()で取得、Model_Memo::forge()->save()で保存を行っています。
さ、これでできたはずです。
curl コマンドでちゃんと動くか確認します。
POSTで書き込み。
curl http://localhost:8000/memo/write -d "memo=test1" curl http://localhost:8000/memo/write -d "memo=test2" curl http://localhost:8000/memo/write -d "memo=test3"
GETで取得。
$ curl http://localhost:8000/memo/read
[{"id":"1","memo":"test1","created_at":"2013-12-19 19:48:08","updated_at":"2013-12-19 19:48:08"},{"id":"2","memo":"test2","created_at":"2013-12-19 19:48:12","updated_at":"2013-12-19 19:48:12"},{"id":"3","memo":"test3","created_at":"2013-12-19 19:48:15","updated_at":"2013-12-19 19:48:15"}]
無事、JSONが返却されました。
噂通り、FuelPHP での API 実装はとてもお手軽でした。みなさんも一度やってみておくと何かの時にアワアワしなくていいのではないでしょうか。
ところで、ゴリゴリ記事を書いて、必死でスクリーンキャストまで撮って、公開ボタンを押そうとしたまさにその時、@kenji_s さんが、過去に同様のことをなさっていることを発見してしまいました。
決してパクったわけではありません(信じてー)が、もうちょっと過去記事などをしっかり見ておくべきでした。。大変失礼しました。
ただ(言い訳みたいですが)、@kenji_s さんのバージョンは 1.4 で今回は 1.7、また、実装している API や手法も少し異なりますので、実装方法の異なるバージョンとして見ていただければ幸いです。汗。。
明日は、@Altsencturely さんです。
では、また。