CakePHP 2.8 で rails console な REPL 開発環境を作る

# 概要

rubyには[binding.pry（pry-byebug）](https://github.com/deivid-rodriguez/pry-byebug) というREPLがあって、コンソール開発のスピードを超絶加速してくれます。それの php 版です。ステップ実行とかはできないのですが、バッチの開発や、TDDでコンソールのみで開発出来る範囲ならとっても早いです。`debug()`とはサヨナラ。ちなみに、CakePHP3系ではデフォで入ってるみたいです。

# 導入手順

## [psysh](http://psysh.org/) の導入

composer で psysh を追加します。

```
// composer.json
"psy/psysh": "^0.8.14"
```

インストール

```
$ ./composer.pher install
```

## breakpoint() 関数を実装

[CakePHP3系](https://github.com/cakephp/cakephp/blob/d92d4f5f3ca4f2513dd5a8fdab6a1bdb4735af9f/src/basics.php#L92)に習って、`breakpoint()`関数を作ります。
bootstrap.php でも、最適なファイルで利用ください。僕は、`Libs/Debugger.php`に設置してます。

```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 がゴールなので、さらに。

## シェルを作る

```php

/**
 * コンソールでプログラミング出来る
 *
 * 実行
 * `$ /path/to/Console/cake console`
 */
class ConsoleShell extends AppShell
{

    function main()
    {
        eval(\Debugger::breakpoint());
    }
}
```

`$ ./Console/Cake console` で実行できます。


```php
$ ./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 クラス名` で該当クラスを開けます

```php
>>> 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';
```

# おしまい

ブレークポイントを入れて動作確認できるだけでも十分はかどりますが、コンソールがあると気軽に実装確認もできるので、参考になれば嬉しいです。