こんにちは。VOYAGE MARKETINGで学生インターンをしている西尾@blackstar240と申します。

突然ですが、弊社にはCREEDという経営理念があり、その中の一つに
『圧倒的スピード。』
という言葉があります。
本日は『圧倒的スピード。』を誇るPHPのフレームワーク、Phalconを使い、テストプロダクトを作ったことについて書こうと思います。

はじめに


はじめに、Phalconについて簡単にご紹介します。
Phalconとは、C言語で実装されたPHP Extentionであり、
こちらのベンチマーク結果からもお分かりのように、PHPのフレームワークの中では『圧倒的スピード。』を誇るフレームワークです。
BenchExample
また、devtoolsという、スケルトンコードを生成する便利なスクリプトのコレクションもあり、
これまた『圧倒的スピード。』で実装が出来そうな予感がします。
早速、こちらを参考にフレームワークとdevtoolsのインストールを行い、
さくっとプロダクトを作ってみようと思います。

雛形作り


まず、devtoolsを使ってMVCモデルの雛形を作ります。
Webサーバーのドキュメントルートで
$ phalcon project [project name]
コマンドを叩いて下さい。
そうすると、プロジェクトの雛形が完成します。
ProjectHinhagata
続いて、controllerの雛形を作ります。
[project name]ディレクトリ直下で
$ phalcon controller [controller name]
コマンドを叩いてください。
すると、Phalconの命名規則にのっとった名前に変換され、controllerの雛形も完成されます。
ControllerHinagata
続いては、controllerにecho文を書き、正しく呼び出されているか確認してみようと思います。。。が、

routing


まだ、routingを書いていません!!
これでは、せっかく書いたcontrollerも動くはずがありません。
ここは落ち着いてroutingを記述しましょう。
まず、configディレクトリ配下にroutes.phpファイルを作成します。
config/route.phpの記述例がこちらになります。

add("/phalcon", array(
    'controller' => 'phalcon',
    'action' => 'phalcon',
));

$router->add("/punch", array(
    'controller' => 'phalcon',
    'action' => 'punch',
));

return $router;

続いて、confifg/service.phpに以下の記述を追記します。

/**
 * add routing capabilities
 */
$di->set('router', function(){
    require __DIR__.'/routes.php';
    return $router;
});

$diコンテナにsetすることで依存関係をすっきりさせることが出来ますね!!

これで、routingは完成しましたが、今のままだと、
Built-in serverではhttp://localhost:9000/index.php?_url=$1のリクエストで開発しつづけなければなりません
そこで、先ほど作ったconfig/routes.phpに以下の記述を追記しましょう。

$router->setUriSource($router::URI_SOURCE_GET_URL);
$router->setUriSource($router::URI_SOURCE_SERVER_REQUEST_URI);

これで、http://localhost:9000/phalconのような
綺麗なURIでの実装も可能となりました。

テンプレートの使い分け


ここまで、controllerから直接echo文を実行し、挙動を確認してきました。
続いて、viewのテンプレートを各コンテキストごとに使い分けてみようと思います。
まず、app/views/layoutディレクトリにcontrollerと対応する名前の.volt(.phtml)ファイルを作成します。
ViewsHinagata
controllerからメソッドでviewファイルへのレンダリングを記述します。

view->setTemplateAfter('phalcon');
    }

    public function punchAction()
    {
        $this->view->setTemplateAfter('punch');
    }

}

ここまで記述した所で、実際の挙動を見てみましょう。

Phalcon

Punch

Finish

見事、ファルコンパンチが繰り出されました!!

感想


今回、Phalconを使ってテストプロダクトを作成致しました。日本語でPhalconについて紹介する記事がまだまだ少ない中、開発において必要不可欠な要素についてご紹介することが出来たので、Phalconを使ってみたいと思っている方の一助となれば幸いです。
Webサービス作りにおいて、フレームワークの選択が重要となる昨今、今回のテストプロダクト作りで得た知見も活かし、今後も努力を重ねていく所存であります。
また、公式ドキュメント上にはサンプルコードも掲載されているので、よろしければお試し下さい。
最後に、このエントリーの内容を実装したものがこちらになります。
https://github.com/Nissy0409/phalcon

最後までお付き合いいただき、ありがとうございました。