REST APIをPhalconPHPで開発

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

をディレクトリルートとなるように設定した。そのルートフォルダの中身は画像の状態とした。

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版は下ページからダウンロードできる。

Windows版Curlのダウンロード

上のページからzipをダウンロードし展開後

curl.exe

C:\Windows\System32

にコピーすればインストールは完了である。コマンドプロンプトを起動して、

curl-rest

画像のようにすれば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を開発することができる。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

REST APIをPhalconPHPで開発の記事にコメントを投稿