噂のPhalcon FrameworkをWindowsで動かしてみた
"The fastest PHP Framework" を標榜する Phalcon フレームワーク、実はWindows版もあるんです。
Phalcon for Windows を入れる
extension として実装されてるわけですが、Windowsの場合は DLL ファイルを置くだけなのである意味Linux版よりもインストールは楽ちんです。
環境に合うものをダウンロードして展開、php_phalcon.dll を php.ini で設定された extension_dir に配置します。
(C:\php にPHPをインストールした場合、多分 C:\php\ext になるはず)
php.iniへの設定追加も忘れずに。
php.ini
extension=php_phalcon.dll
Phalcon DevTools を入れて phalcon コマンドの準備
Phalcon の流儀に従って一からファイルを作成してもいいんですが…
Phalcon DevTools に付属の phalcon コマンドを使えば、プロジェクトのひな形を作成してくれるので、最初はこれに頼った方がいいかなぁと。
Composer でのインストールにも対応していますが、プロジェクト単位に配置する物ではないので、普通に git clone して、クライアントアプリケーションと考えて適当な場所に入れた方がいいでしょう。
私の場合は C:\Applications\phalcon-devtools に配置しました。
Windows用に用意されている phalcon.bat の中身はこんな感じになってます。
phalcon.bat
@echo off set PTOOLSPATH=%~dp0\ php %PTOOLSPATH%\phalcon.php %*
ここにパスを通すなり、シンボリックリンクやジャンクションを作成するなりします。
私の場合はシェルにNYAOSを使ってるので _nya 設定ファイルにこんな感じで alias の設定を追加しました。
%HOME%_nya
alias phalcon C:\Applications\phalcon-devtools\phalcon.bat
なお公式ドキュメントでは c:\phalcon-tools に入れて、このパスをPath環境変数に追加することを推奨しています。
phalcon コマンドでプロジェクトの雛形を作成
コマンドラインで phalcon project と入力すると、ヘルプが表示されます。
$ phalcon project
Phalcon DevTools (1.2.4)
Help:
Creates a project
Usage:
project [name] [type] [directory] [enable-webtools]
Arguments:
help Shows this help text
Example
phalcon project store simple
Options:
--name Name of the new project
--enable-webtools Determines if webtools should be enabled [optional]
--directory=s Base path on which project will be created [optional]
--type=s Type of the application to be generated (micro, simple, modules)
--template-path Specify a template path [optional]
--use-config-ini Use a ini file as configuration file [optional]
--trace Shows the trace of the framework in case of exception. [optional]
--help Shows this help
これによると "project [name] [type] [directory] [enable-webtools]" とあります。
type オプションには micro, simple, modules の三種類あって、プロジェクトのスタイルによっていずれかを選択すればいいようです。
スタイルの違いはこちらが参考になります。
「simple」の場合は controllers ディレクトリにコントローラクラスを配置するのに対して、「micro」の場合は app.php にルーティング設定とハンドラを無名関数で定義するスタイルのようです。
ここは、Silex好きな私には馴染み良さそうな感じの micro で。
$ phalcon project test micro
Phalcon DevTools (1.2.4)
Success: Project 'test' was successfully created.
testディレクトリが作成され、中には .htaccess, app.php, index.html ファイルと、.phalcon, config, modules, public, views ディレクトリが作成されています。
流れを追ってみます。
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule>
リクエストされたパスの前に public/ を付けて…
public/.htaccess
AddDefaultCharset UTF-8 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] </IfModule>
public/ で受けたパスを index.php に _url パラメータで渡して…
public/index.php
<?php error_reporting(E_ALL); try { /** * Read the configuration */ $config = include __DIR__ . '/../config/config.php'; /** * Include Services */ include __DIR__ . '/../config/services.php'; /** * Include Autoloader */ include __DIR__ . '/../config/loader.php'; /** * Starting the application */ $app = new \Phalcon\Mvc\Micro(); /** * Assign service locator to the application */ $app->setDi($di); /** * Incude Application */ include __DIR__ . '/../app.php'; /** * Handle the request */ $app->handle(); } catch (Phalcon\Exception $e) { echo $e->getMessage(); } catch (PDOException $e){ echo $e->getMessage(); }
設定ファイル(.phpファイル!)を読み込んで、DIコンテナにサービスを登録して、オートローダーを読み込んで、アプリケーションオブジェクト(Phalcon\Mvc\Micro)を生成して実行しているようです。
例外処理とかすっごい雑ですが、あくまで雛形なので、好きに変えちゃっていい…のでしょうか。
ルーティング設定は、途中で読み込まれる app.php で行われています。
app.php
<?php /** * Add your routes here */ $app->get('/', function () use ($app) { echo $app['view']->getRender(null, 'index'); }); /** * Not found handler */ $app->notFound(function () use ($app) { $app->response->setStatusCode(404, "Not Found")->sendHeaders(); echo $app['view']->getRender(null, '404'); });
こういう突然変数が現れる書き方も好きじゃないんですが、なんとなく流れは分かりました。
ビルトインWebサーバ用のルーティングスクリプトを作成
せっかくなので、ビルトインWebサーバで実行できるようにします。
プロジェクト内の public ディレクトリ直下にルーティングスクリプトを作成します。
public/.router.php
<?php $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); if (file_exists(realpath(__DIR__ . $path))) { return false; } $_GET['_url'] = $_SERVER['REQUEST_URI']; require __DIR__ . DIRECTORY_SEPARATOR . 'index.php';
Windowsなので、ビルトインWebサーバ起動用のショートカットを作成するのが楽だと思います。
リンク先を C:\php\php.exe -S 127.0.0.1:8080 .router.php として、作業フォルダーにドキュメントルートを指定します。
ビルトインWebサーバを起動して、ブラウザで 127.0.0.1:8080 を見てみます。
ヤッター ∩( ・ω・)∩ とりあえず動くところまで確認できました。