タスク重要
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
となります。