[FuelPHP 1.7] タスクからタスクを実行する
開発チームの日下部です。
早速ですがFuelPHPのタスクを作成しているときに、タスクからタスクを実行したいと考えたことはないでしょうか。そのへんのお話を書きます。
タスクからタスクを実行
次のような、実行するとsugoiと表示するタスクがあるとします。
taskone.php
<?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
<?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)を参考に、次のようにするとよいでしょう。
[推奨]
<?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
できましたね。以上となります。
次回はもう少し複雑な、モジュール内のタスクをタスク内から呼び出す方法を考えます。
この記事がお役に立てば【 いいね 】のご協力をお願いいたします!