Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@engineer_atsumi

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 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
2
Help us understand the problem. What are the problem?