概要
rubyにはbinding.pry(pry-byebug) というREPLがあって、コンソール開発のスピードを超絶加速してくれます。それの php 版です。ステップ実行とかはできないのですが、バッチの開発や、TDDでコンソールのみで開発出来る範囲ならとっても早いです。debug()
とはサヨナラ。ちなみに、CakePHP3系ではデフォで入ってるみたいです。
導入手順
psysh の導入
composer で psysh を追加します。
// composer.json
"psy/psysh": "^0.8.14"
インストール
$ ./composer.pher install
breakpoint() 関数を実装
CakePHP3系に習って、breakpoint()
関数を作ります。
bootstrap.php でも、最適なファイルで利用ください。僕は、Libs/Debugger.php
に設置してます。
<?php
class Debugger
{
/**
* Command to return the eval-able code to startup PsySH in interactive debugger
* Works the same way as eval(\Psy\sh());
* psy/psysh must be loaded in your project
* @link http://psysh.org/
* ```
* eval(\Debugger::breakpoint());
* ```
* CakePHP3では標準導入されてます。
* @link https://github.com/cakephp/cakephp/blob/d92d4f5f3ca4f2513dd5a8fdab6a1bdb4735af9f/src/basics.php#L103
* @return string
*/
public static function breakpoint()
{
if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') && class_exists('\Psy\Shell')) {
// `$this`がnullになってしまうので、
// 明示的に `$t` に値を格納する形をとってる。
return 'extract(\Psy\debug(array_merge_recursive(get_defined_vars(), array("t" => $this)), $this));';
}
trigger_error(
'psy/psysh must be installed and you must be in a CLI environment to use the breakpoint function',
E_USER_WARNING
);
}
}
これで、コード中に eval(\Debugger::breakpoint());
を入れることでブレークポイントを仕込んで開発ができます。
が、今回は rails console がゴールなので、さらに。
シェルを作る
/**
* コンソールでプログラミング出来る
*
* 実行
* `$ /path/to/Console/cake console`
*/
class ConsoleShell extends AppShell
{
function main()
{
eval(\Debugger::breakpoint());
}
}
$ ./Console/Cake console
で実行できます。
$ ./Console/cake console
Welcome to CakePHP v2.8.9 Console
---------------------------------------------------------------
Psy Shell v0.8.14 (PHP 5.3.29 — cli) by Justin Hileman
New version is available (current: v0.8.14, latest: v0.9.4)
From Console/Command/ConsoleShell.php:16:
14| function main()
15| {
> 16| eval(\Debugger::breakpoint());
17| }
18| }
>>> list
Variables: $t, $this
>>> $user = ClassRegistry::init('User')
$user = ClassRegistry::init('User')
>>> $u = $user->findById(1)
>>> $u['User']['name'] = 'hogehgoe'
>>> $user->save($u)
といった形で、簡単に実装を確認できます。
その他
psyshコンソール内に標準装備の関数があります。
list
で今展開されてる変数一覧見れます
>>> list
Variables: $a, $t, $this, $U, $user, $User
show クラス名
で該当クラスを開けます
>>> show Model
> 45| class Model extends Object implements CakeEventListener {
46|
47| /**
48| * The name of the DataSource connection that this Model uses
49| *
50| * The value must be an attribute name that you defined in `app/Config/database.php
51| * or created using `ConnectionManager::create()`.
52| *
53| * @var string
54| * @link http://book.cakephp.org/2.0/en/models/model-attributes.html#usedbconfig
55| */
56| public $useDbConfig = 'default';
おしまい
ブレークポイントを入れて動作確認できるだけでも十分はかどりますが、コンソールがあると気軽に実装確認もできるので、参考になれば嬉しいです。