Phalcon に限った話では無いのですが、デバッグ作業やモデルを直接操作して確認したいことがあるとき、PHP の対話シェルがとても便利です。
PHP の対話シェルとは
↓こんな感じで操作できます。
[user@host ~]$ php -a
Interactive mode enabled
php > echo "Hello, world!\n";
Hello, world!
php >
こんな環境で、Phalcon プロジェクトのモデルやら何やらが直接操作できたらデバッグ作業が捗る、というお話です。
使える条件
PHP 5.1.0 以降で、コンパイルオプション --with-readline
を付けてコンパイルされた PHP 環境
これが選択できない場合、PEAR で導入できる php shell をインストールして使うという方法もあります。
Phalcon プロジェクト環境で使う
↓例えばこんな塩梅で書いたモデルを直接いじり倒したい
php > $user = Users::findFirst(1);
php > echo $user->getUsername() . "\n";
sukobuto
php > echo $user->setEmail("sukobuto@gmail.com")->save() ? "OK\n" : "NG\n";
OK
php >
という場合、Phalcon なら 設定・ローダー・サービス の3兄弟を読みこめば OK です。
たとえば↓のような読み込みスクリプトを置いておきます。
/**
* Read the configuration
*/
$config = include __DIR__ . "/config/config.php";
/**
* Read auto-loader
*/
include __DIR__ . "/config/loader.php";
/**
* Read services
*/
include __DIR__ . "/config/services.php";
次のように読み込みます。
また phalcon.so 等を正しく読み込むため、必ず php.ini を指定します。
[user@host app]$ php -c /etc/php.ini -a
Interactive mode enabled
php > include "shell.php";
php >
めんどくさがりなあなたは
これだけ置いとけばいいスクリプトを用意しました。
Linux を使っている場合、以下のスクリプトを app
配下に置きます。
# !/usr/bin/expect
set timeout 5
spawn php -c /etc/php.ini -a
expect "php > "
send "\$config = include __DIR__ . \"/config/config.php\";\n"
send "include __DIR__ . \"/config/loader.php\";\n"
send "include __DIR__ . \"/config/services.php\";\n";
interact
php.ini の場所が異なる場合はちゃんと書き換えましょう
このスクリプトは expect
というシェルプログラムで実行されます。
インストール済みでない場合はインストールしましょう。
[user@host app]$ sudo yum install expect
[user@host app]$ chmod 700 shell.sh
起動すると...
[user@host app]$ ./shell.sh
spawn php -c /etc/php.ini -a
Interactive mode enabled
php > $config = include __DIR__ . "/config/config.php";
php > include __DIR__ . "/config/loader.php";
php > include __DIR__ . "/config/services.php"; // ここまで自動!!
php >
オートローダも問題なく動作します。
心置きなくいじり倒しましょう。
コメントを下さった localdisk さんの影響でスクリーンキャストを撮ってみました。
その他の環境 (CakePHP, Symfony2, etc...) について
よくわかりません。
Phalcon は DI コンテナがシンプルで単純に読みこめばできたので簡単でしたが、ほかのフレームワークだとどうなるのでしょうか...