[FuelPHP 1.7] タスクからタスクを実行する
開発チームの日下部です。
早速ですがFuelPHPのタスクを作成しているときに、タスクからタスクを実行したいと考えたことはないでしょうか。そのへんのお話を書きます。
タスクからタスクを実行
次のような、実行するとsugoiと表示するタスクがあるとします。
taskone.php
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace Fuel\Tasks; class TaskOne { public static function run() { \Cli::write( 'sugoi' ); return 0; } } |
このTaskOneを別のタスク内から実行することを考えます。
TaskOneを呼び出すタスクをTheTaskとして定義します。
ディレクトリ構成は
fuel
└app
└tasks
├taskone.php
└thetask.php
であるとします。
thetask.php
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace Fuel\Tasks; class TheTask { public static function run() { TaskOne::run(); return 0; } } |
これでいけると思いませんか。TheTaskを実行してみましょう。
$ oil refine TheTask Fatal Error - Class 'Fuel\Tasks\TaskOne' not found in APPPATH/tasks/thetask.php on line 8 |
だめです。TaskOneクラスが見つかりません。
同じ名前空間のクラスなので、オートローダが気を利かせて読み込んでくれそうな気がしますが、そんなことはありませんでした。こちらで読み込みを指示しなければなりません。
タスクのロード
やるべきことはtaskone.phpの読み込みです。
[非推奨]
require_once '/path/fuel/app/tasks/taskone.php' ; |
こうすれば目的のファイルを読み込めますが、ソースにファイルのパスを直接書くのは避けたいですよね。
動的にパスを取得する方法を考えます。
Oilコマンドの実装(fuel/packages/oil/classes/command.php)を参考に、次のようにするとよいでしょう。
[推奨]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php namespace Fuel\Tasks; class TheTask { public static function run() { # tasksディレクトリの中からTaskOneに対応するファイルを探し、そのパスを取得 $file = \Finder::search( 'tasks' , strtolower ( 'TaskOne' )); # TaskOneのファイルをロード require_once $file ; # TaskOneを実行 TaskOne::run(); return 0; } } |
実行してみます。
$ oil refine TheTask sugoi |
できましたね。以上となります。
次回はもう少し複雑な、モジュール内のタスクをタスク内から呼び出す方法を考えます。
この記事がお役に立てば【 いいね 】のご協力をお願いいたします!