[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

できましたね。以上となります。

次回はもう少し複雑な、モジュール内のタスクをタスク内から呼び出す方法を考えます。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
1
読み込み中...
1 票, 平均: 1.00 / 11
3,582
X facebook はてなブックマーク pocket

この記事をかいた人

About the author