cakeタスクを自作する

CakePHP1.2で、cakeコマンドから実行できるタスクの作り方。データベースにSQLをロードするサンプルです。

タスク重要

javaのant、rubyのrake、アジャイル開発には欠かせないツールですよね。もちろんCakePHPにも、cakeがあります。こういうの興味ナイ方が多い気もしますが、自分にとっては非常に大事なツールなので、検証。

ホントにみなさん、タスクは作りましょう、使いましょう。リリース作業でいっぱいキーパンチしてるエンジニアは、デキる人には見えナイぞっ。

cake bake

  cake/console/libs/bake.php
  cake/console/libs/tasks/*.php

あたりを解読すると、自作タスクの作り方がわかるので、この記事よりもソース見たほうが早いかも。bakeを使ったことがあればわかると思いますが、CakePHPの場合、標準入力・標準出力を簡単にコントロールできるので、対話型のタスクを作ることができます。ここが面白い。

cakeコマンドの大枠

自作タスクは、1つのシェルと複数のタスクからなります。シェルは/vendors/shells/に、タスクは/vendors/shells/tasks/に配置します。どちらもShellクラスを継承しますが、シェルはmainメソッドを、タスクはexecuteメソッドを実装することになります。実行するには、

 > cake <シェル名> <タスク名>

とします。以上を踏まえて、シェルは、次のような感じ。

■/vendors/shells/takeda.php
<?php
class TakedaShell extends Shell{

 //ここで定義した名前のTaskが生成される。
 var $tasks = array('Something', 'Little');

 function main(){
  //デフォルトだと全部実行
  $this->Little->execute();
  $this->Something->execute();
 }
}
?>

各々のタスクは、次のように書きます。ファイル名・クラス名・タスク名は、微妙な命名規約上に成り立っているようなので、注意してください。

■/vendors/shells/tasks/something.php
<?php
class SomethingTask extends Shell {
 function execute(){
  print_r('何か');
 }
}
?>
■/vendors/shells/tasks/little.php
<?php
class LittleTask extends Shell {
 function execute(){
  print_r('ちっぽけな');
 }
}
?>

実行してみると、

 > cake takeda
  ちっぽけな何か

 > cake takeda something
  何か

 > cake takeda little
  ちっぽけな

となります。

SQLロードのタスク

今回は、自分としては良く使う、テーブルの初期化を一発でやるためのタスクを作ってみます。同じ要領で、DBにSQLファイルをロードするタスクを作ると、

<?php
class TakedaShell extends Shell{
 var $tasks = array('Initdb');
 function main(){
 }
}
?>

■/vendors/shells/tasks/initdb.php
<?php
class InitdbTask extends Shell {
 function execute(){
  $this->_loadDbConfig();
  $login = $this->dbConfig->default["login"];
  $pass = $this->dbConfig->default["password"];
  $db = $this->dbConfig->default["database"];
  $sqlfile = ROOT . DS . APP_DIR . DS . "create_table.sql";
  shell_exec("mysql -u " . $login . " -p" . $pass . " " . $db
        . " < ". $sqlfile );
 }
}
?>

 > cake takeda initdb

となります。



コメント

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: