【CakePHP】ShellとTaskで作る簡単コンソールアプリ

【CakePHP】ShellとTaskで作る簡単コンソールアプリ

こんにちは、シーブレインのinoueです。
雲の向こうに三日月のような日食の太陽を見ることができました。
何十年に一度の天体ショーも雨雲にはかなわず。これぞ自然、とも思ったり。

さてさて、サイトの管理画面にメニューがないけど、ときどき行わなければならないデータ処理、というものが世の中には存在します。
単純なことなら、データベースに接続して、直接SQLクエリを発行すればOK!なのですが、「この条件に該当するデータすべてにこの処理を行う」といった類の処理の場合、やはり手順書よりもプログラムを組んじゃったほうが楽ちんです。

とはいえ、こういった裏の裏の処理に対してwebページ状のユーザーインターフェースまで用意するのはちょっとオーバー。
そんなときに、CakePHPの場合、ShellとTaskというありがたいコマンドライン機能が用意されています。 このShellとTaskを使うと簡単に対話型のコンソールアプリケーションが作成できますので、使ったことのない方はぜひお試しください。

アプリケーションのパスが /home/sample/app のとき、Shell関連のファイルは /home/sample/app/vendor/shells/ に保存します。このshellsディレクトリの下に Taskの保存先ディレクトり tasks/ があります。
また、ファイル名はSampleShell クラスは sample.php、SampleMenuTask クラスは sample_menu.php となります。

サンプルコードはこんなかんじ:

shells/sample.php
<?php
/*
 * サンプル シェル
 *
 */
class SampleShell extends Shell {

    var $tasks = array('Menu1','Menu2','Menu3');

    //overrideでcakeメッセージ除去
    function startup(){}

    function main()
    {

        //メインメニュー作成
        $mainMenu = array(
            '1' => array('name' => 'Menu1','alt' => 'メニュー1'),
            '2' => array('name' => 'Menu2','alt' => 'メニュー2'),
            '3' => array('name' => 'Menu3','alt' => 'メニュー3'),
            'q' => array('name' => null,'alt' => '終了'),
            );
        $mainMenuKeys = array_keys($mainMenu);

        //メインメニュー表示
        $value = "";
        $this->out("---------------------------------------------");
        foreach($mainMenu as $k => $v) {
            $this->out("[{$k}] {$v['alt']}");
        }
        $this->out("---------------------------------------------");
        while ($value <> "q") {
            $value = $this->in("実行するメニューの番号を選択してください", $mainMenuKeys, "q" );

            if ($value <> 'q') {
                $this->$mainMenu[$value]['name']->execute();
            }
        }
    }
}
?>

shells/tasks/menu1.php
<?php
/*
 * メニュー1タスク
 *
 */
class Menu1Task extends Shell {

    //overrideでcakeメッセージ除去
    function startup(){}

    function execute()
    {
        $this->out("メニュー1 実行");
    }
}
?>

(メニュー2、3も同様に)

これを実行した出力結果がこちら:

>cake sample -app /home/sample/app

---------------------------------------------
[1] メニュー1
[2] メニュー2
[3] メニュー3
[q] 終了
---------------------------------------------
実行するメニューの番号を選択してください (1/2/3/q) 
[q] > 1
メニュー1 実行

実行するメニューの番号を選択してください (1/2/3/q) 
[q] > 2
メニュー2 実行

実行するメニューの番号を選択してください (1/2/3/q) 
[q] > 3
メニュー3 実行

実行するメニューの番号を選択してください (1/2/3/q) 
[q] > q

> 

実行時にappのパスを渡してあげることをお忘れなく。
bakeコマンドのようなものが簡単に自作できることがおわかりいただけたでしょうか。

ちょっと簡単な紹介になってしまったので、次回、taskで実際にプログラミングして便利だったことについて、あらためてエントリーしたいと思います。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ