Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

仕様

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

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

前提条件

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

使用するメソッド

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

テキストの出力

//※第二,第三引数は省略可能
$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が1のレコードが連想配列で表示される

※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
)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした