爆速フレームワークでrest apiを作った話
TRANSCRIPT
今日は 2015年で一番印象に残った開発のお話をします。
爆速 PHPフレームワークでREST APIを作った話
泰昌平 @stai0823
自己紹介
泰昌平 ファンチーム株式会社 Webエンジニ
ア・平成生まれ・元システムエンジニア・ Java好きペチパー・フロントの javascriptが大好物・ダーツとバイクが好き
今年中頃の話・・・
ポータルサイト開発をしながら色々思うところがありました
業務レベルで新しい技術に挑戦したい
・自分で他言語を勉強しながら PHP案件
・ PHP自体は 5.3~ 5.6までやり込んだ
・ CakePHPが多め
開発リーダー陣にアピールはしていた
・自社サービスをやっているので、新たにサイトを作ったり、機能を提案して作れる環境。
・リーダーは技術に対してポジティブな方が多かった。→反面、リリースの速さを重視しているので、 FWや言語を変えるタイミングがなかった。
(このままだと CakePHPerになる)
と、思ってたら
ポイントシステムを作る事になった
・ポイントの付与、利用、期限管理の REST
API
・ポイントシステムの設計、開発は自分一人
ポイントシステムを作る事になった
・ポイントの付与、利用、期限管理の REST
API
・ポイントシステムの設計、開発は自分一人
・理由があればどんな言語、 FWでも良い
ポイントシステムを作る事になった
・ポイントの付与、利用、期限管理の REST
API
・ポイントシステムの設計、開発は自分一人
・理由があればどんな言語、 FWでも良い
・なる早でやってね
言語自由!!FW自由!!
言語・ FWの選定・ REST APIを作る→実装がシンプルなので FWが高機能すぎても微妙→今後は複数サイトで連携して使う可能性があるので、 それなりのリクエストを捌けるような言語・ FWが必要
・ポイントの付与、利用、期限管理をする→規模自体大きくはないので、全体の見通しを良くしたい→やはり高機能な FWは不要・・
言語・ FWの選定・保守性、拡張性→言語や FWのトラブルにも対応できるように、 フォーラムが活発なものにしたい。→他の開発者でもすぐ触れるよう、読みやすい FWにしたい
・なる早でやる→短納期の中、普段使っている言語以外に新しいものを入れるのは 学習コスト・リスクが高い
_人人人人人人人人人_ > 新しい言語は無理< ̄ Y^Y^Y^Y^Y^Y^Y^Y^ ̄
じゃあ FWはどうするのか
CodeIgnighter? Slim?Laravel?
Phalconに出会った
Phalconを選んだ理由
・他の FWを圧倒する速度・アプリの規模に合わせた構成を選べる・フォーラムが活発
スループット
メモリ使用量
構成も自由に選べる - SingleModule
構成も自由に選べる - MultiModule
構成も自由に選べる - Micro
フォーラムが活発
機能も充実している
・ ORM・ DI・ AutoLoader・ PHQL・ Filter・ ACL・ Forms Builder
・ Pagination・ Cache・ Security・ Cookies・ Validation・FlashMessages・TemplateEngine
などなど。。
REST APIを作るまでの流れ
導入 (Linux)1.Phalconモジュールをインストール
git clone git://github.com/phalcon/cphalcon.gitcd cphalcon/buildsudo ./install
2.「 php.ini」で読み込み
extension=phalcon.so
実装
・アプリケーションのメインとなるクラスを読み込む・規模に応じたクラスが用意されている・今回はMicroApplication(Microクラス )で実装・ DIやローダーで肉付けをしていく
実装 (Config)// Read the configuration$config = include __DIR__.'/../config/config.php';
// config.phpreturn new \Phalcon\Config(array(
'database' => array('adapter' => 'Mysql','host' => 'localhost','username' => 'root','password' => '','name' => 'test',
),'application' => array(
'modelsDir' => __DIR__ . '/../models/','baseUri' => '/api/',
)));
実装 (bootstrap)$di = new FactoryDefault();// Database connection is created based in the parameters defined in the configuration file$di->set('db', function() use ($config) {
return new Database(array("host" => $config->database->host,"username" => $config->database->username,"password" => $config->database->password,"dbname" => $config->database->name
));});// Registering an autoloader$loader = new Loader();$loader->registerDirs(
array($config->application->modelsDir
))->register();
実装 (API)$app = new Micro($di);// Retrieves all robots$app->get('/api/robots', function () use ($app) {
});// Retrieves robots based on primary key$app->get('/api/robots/{id:[0-9]+}', function ($id) use ($app) {
});// Adds a new robot$app->post(('/api/robots', function () use ($app) {
});// Updates robots based on primary key$app->put('/api/robots/{id:[0-9]+}', function ($id) use ($app) {
});// Deletes robots based on primary key$app->delete('/api/robots/{id:[0-9]+}', function ($id) use ($app) {
});$app->handle();
実装 (Model)$app->get('/api/robots', function () use ($app) { $robots = Robots::find(array( "conditions" => "type = ?1", "bind" => array(1 => "virtual") )); $data = array(); foreach ($robots as $robot) { $data[] = array( 'id' => $robot->id, 'name' => $robot->name ); } return $app->response->setJsonContent($data);});
ソース
・サンプルプロジェクトhttps://github.com/phalcon/mvc・マイクロアプリケーションhttps://docs.phalconphp.com/ja/latest/reference/micro.html・ REST APIチュートリアルhttps://docs.phalconphp.com/ja/latest/reference/tutorial-rest.html
最後に
Phalconを使ってみて
アプリ構成が自由なので、設計の幅が広がり楽しく開発ができた。必要な機能だけ読み込んで開発できたので可読性が高く、好評だった。ドキュメントやフォーラムが充実しているので、Phalconの機能でハマる事も少なかった。
Phalconを使ってみて
FWの縛りが少ない分、フリーダムに作り過ぎると大変な目に遭う。最近は増えてきたけれども、他の FWと比べると日本語の情報が若干少ないので、英語との戦いになることがある。
いかがでしたでしょうか?
機会があれば是非、Phalconを使ってみてください!
ご清聴ありがとうございました
良いお年を!
Credits
Special thanks to all the people who made and released these awesome resources for free:✘ Presentation template by
SlidesCarnival✘ Photographs by Unsplash