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

仕様

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

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

前提条件

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

使用するメソッド

使用したメソッドは下記2つです。

テキストの出力

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

ユーザーからの入力を受け取る関数

$変数 = $this->in(メッセージ内容,選択する配列,デフォルト値)

サンプル

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

UserInputShell.php
<?php
namespace AppShell;

use CakeConsoleConsoleOptionParser;
use CakeConsoleShell;
use CakeLogLog;
use CakeORMTableRegistry;

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が1のレコードが連想配列で表示される

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

関数で記述した場合

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

FuncUserInputShell.php
<?php
namespace AppShell;

use CakeConsoleConsoleOutput;
use CakeConsoleConsoleOptionParser;
use CakeConsoleShell;
use CakeLogLog;

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
)
[紹介元] PHPタグが付けられた新着投稿 – Qiita CakePHP3 シェルプログラム サンプル

関連記事