CakePHP3 シェルプログラム　サンプル

#仕様
下記オリジナルのシェルプログラムを作る

内容は、
①データが格納されている２つのテーブルをどれかをユーザーが選択(今回はBoards,Peopleテーブル)
②ID番号を入力してもらう。
③IDの番号のレコードを連想配列表示させる仕様

#前提条件


データが格納されたBoards,People テーブルがあるとする

#使用するメソッド
使用したメソッドは下記２つです。

##テキストの出力
```
//※第二,第三引数は省略可能
$this->out(出力する値,改行の行数(デフォルトは1),レベル(Shell::QUIET,Shell::NORMAL,Shell::VERBOSE));
```

##ユーザーからの入力を受け取る関数
```
$変数 = $this->in(メッセージ内容,選択する配列,デフォルト値)
```

#サンプル

下記のコードをShellディレクトリに格納する。

```UserInputShell.php
<?php
namespace App\Shell;

use Cake\Console\ConsoleOptionParser;
use Cake\Console\Shell;
use Cake\Log\Log;
use Cake\ORM\TableRegistry;

class UserInputShell extends Shell {
	public function initialize(){
        parent::initialize();
    }
    public function main() {
　　　　//シェルを叩いたときの内容
        $this->out('以下のテーブルが利用できます');
        $this->out('[B]oards');
        $this->out('[P]eople');
       //ユーザーにどのテーブルを使用するか選択させ$tに格納
        $t = $this->in('テーブルを選択',['B','P'],'B');
        $t = strtoupper($t);
        $table = null;
        $id = $this->in('IDを入力：',null,1);
        $data = null;
        //$tの内容に応じて、switchで切り分ける
        switch($t) {
        	case 'B':
        		$table = 'Boards';
        		$this->loadModel('Boards');
        		$data = $this->Boards->get($id);
        		break;
        	case 'P':
        		$table = 'People';
        		$this->loadModel('People');
        		$data = $this->People->get($id);
        		break;
        	default:
        		$this->info("can't access Database...");
        		exit();
        }
        //配列一覧を表示
        $this->out();
        $this->out("※{$table} id={$id}のレコード:");
        $this->out(print_r($data->toArray()));
    }
}
```

#どのように表示されるか

シェルを起動させるために、CakePHPが格納されているディレクトリまでアクセス

```
①作成したshellプログラム(UserInputShell.php)の起動

bin/cake user_input

以下のテーブルが利用できます
[B]oards
[P]eople
テーブルを選択 (B/P)
[B] >

②Bと選択した場合

IDを入力：
[1] >

③ 1と入力したら、IDが１のレコードが連想配列で表示される

※Boards id=1のレコード:
Array
(
    [id] => 1
    [person_id] => 1
    [title] => test
    [content] => This is test
)

```

#関数で記述した場合

リファクタリングしやすいように、関数に分けて記述すると下記のようになります。

```FuncUserInputShell.php
<?php
namespace App\Shell;

use Cake\Console\ConsoleOutput;
use Cake\Console\ConsoleOptionParser;
use Cake\Console\Shell;
use Cake\Log\Log;

class FuncUserInputShell extends Shell {

	public function initialize() {
		parent::initialize();
	}

	public function main(){
		$this->out('※以下のテーブルが利用できます。');
		$this->out('[B]oards');
		$this->out('[P]eople');
		$t = $this->in('テーブルを選択：', ['B', 'P'], 'B');
		$t = strtoupper($t);
		$n = $this->in('ID番号を入力：', null, 1);
		switch($t){
			case 'B':
				$this->boards($n);
				break;
			case 'P':
				$this->people($n);
				break;
			default:
				$this->info("can't access Database...");
				exit();
		}
	}

	public function boards($id){
		$this->loadModel('Boards');
		$data = $this->Boards->get($id);
		$this->out("※Boards id={$id}");
		$this->out(print_r($data->toArray()));
	}

	public function people($id){
		$this->loadModel('People');
		$data = $this->People->get($id);
		$this->out("※People id={$id}");
		$this->out(print_r($data->toArray()));
	}

}
```

##コマンド

先程と同じようなコマンドでも実行することができるが、下記のように記述することで、先程と同じデータを受け取ることができる

```
bin/cake func_user_input boards 1

→実行結果
※Boards id=1
Array
(
    [id] => 1
    [person_id] => 1
    [title] => test
    [content] => This is test
)
```