PhalconでRESTfulなAPIを迅速に作成する
公式サイトのチュートリアルが分かりやすい
PHPフレームワークPhalconでREST APIを開発してみたい。
下のURLが公式のチュートリアルなので、ほぼその案内に従いやってみた。
http://docs.phalconphp.com/en/latest/reference/tutorial-rest.html
APIのリクエストURLを
.json
で終わるようにしたかったので、主にその点を変更して作業内容を載せてみたい。
作り方
VirtualHostとmod_rewriteの設定
今回RESTful APIを作成するにあたり専用のVirtualHostを用意した。
<VirtualHost *:80> ServerName phalcon-restapi.local DocumentRoot "C:/xampp/htdocs/vhost/phalcon-restapi" DirectoryIndex index.php <Directory "C:/xampp/htdocs/vhost/phalcon-restapi"> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] </IfModule> AllowOverride all Require all granted </Directory> </VirtualHost>
ServerNameに
phalcon-restapi.local
を設定したので、そのURLでリクエストでいるようにhostsを設定した。
192.168.0.2 phalcon-restapi.local
DBテーブルの定義
開発する際に利用したテストデータとDDLは以下の内容。
CREATE TABLE IF NOT EXISTS `robots` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(256) NOT NULL, `type` varchar(256) NOT NULL, `year` varchar(256) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; INSERT INTO `robots` (`id`, `name`, `type`, `year`) VALUES (1, 'robot1', 'droid', '2014'), (2, 'UPDATE4', 'droid', '1977'), (3, 'test name', 'droid', '1977'), (4, 'test name2', 'droid', '1977');
念のためだがPhalconにはデータマイグレーションの機能も備わっているようだ。
作成するファイルは2つ
- index.php
- models\Robots.php
上の2つのファイルを作成する。
VirtualHostの設定で、
phalcon-restapi
をディレクトリルートとなるように設定した。そのルートフォルダの中身は画像の状態とした。
Modelについては、Creating a Modelの内容をそのまま利用して試してみた。validationも設定されているのでその点も参考にしたい。
マイクロアプリケーション
Phalconの場合、CakePHPと異なり最小限の構成でアプリケーションを開発することが可能。REST APIを開発する際にはフォームなどのView機能を省略したマイクロアプリケーションを開発することができる。index.phpのベースは以下のようにした。
error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 'On'); // ローダーの定義 $loader = new \Phalcon\Loader(); $loader->registerDirs(array( __DIR__ . '/models/' ))->register(); // $diの構築 $di = new \Phalcon\DI\FactoryDefault(); $di->set('db', function(){ return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "dbadmin", "password" => "pass", "dbname" => "robotics" )); }); // マイクロアプリケーションの開始 $app = new Phalcon\Mvc\Micro($di); $app->get('/', function() { echo "RESTful API Phalcon"; }); // 全件取得 $app->get('/robots.json', function() use ($app) { }); // 検索 $app->get('/robots/search/{name}.json', function($name) use ($app) { }); // 個別取得 $app->get('/robots/{id:[0-9]+}.json', function($id) use ($app) { }); // データの投稿 $app->post('/robots.json', function() use ($app) { }); // データの更新 $app->put('/robots/{id:[0-9]+}.json', function($id) use($app) { }); // データの削除 $app->delete('/robots/{id:[0-9]+}.json', function($id) use ($app) { }); // 404エラー $app->notFound(function () use ($app) { $app->response->setStatusCode(404, "Not Found")->sendHeaders(); echo '404 File not Found'; }); $app->handle();
データの参照
GETリクエストについてはブラウザから行い、
phalcon-restapi.local/robots.json // 全件取得
phalcon-restapi.local/robots/4.json // idが4のデータを取得
phalcon-restapi.local/robots/search/test.json // testというキーワードで検索
上のURLにブラウザでアクセスするとjson形式のデータを取得することができる。
登録更新系API
更新系のAPIのリクエストはチュートリアル通りCurlを利用した。Windows版は下ページからダウンロードできる。
上のページからzipをダウンロードし展開後
curl.exe
を
C:\Windows\System32
にコピーすればインストールは完了である。コマンドプロンプトを起動して、
画像のようにすればcurlのバージョン情報が表示される。Curlが利用可能になったので、更新系のAPIを利用してみる。
curl -i -X POST -d "{\"name\":\"test name\",\"type\":\"droid\",\"year\":1977}" http://phalcon-restapi.local/robots.json
nameがすでに登録済みのデータと重複しているとModelのvalidationが機能してエラーになる。typeに規定以外のデータをPOSTした場合もvalidationでエラーとなるので、そのあたりのvalidateの動きも合わせて確認してみるとよいかもしれない。
curl -i -X PUT -d "{\"name\":\"UPDATE4\",\"type\":\"droid\",\"year\":1977}" -H "Content-Type: application/j son" http://phalcon-restapi.local/robots/4.json
PUTメソッドのリクエストURLは上のように
[:id].json
という形式に変更した。削除のリクエストは下の方法でリクエストした。
curl -i -X DELETE -H "Content-Type: application/json" http://phalcon-restapi.local/robots/3.json
PhalconならCakePHP同様素早くRESTful APIを開発することができる。