FuelPHP でコマンド実行タスクを実装する


FuelPHPで、バッチ実行用のコマンドを実装するには、タスク を利用できます。

コントローラをバッチ実行に兼用するCodeIgniterから比べると、この辺りは後継のFuelPHPの方が使いやすくなっています。
また、FuelPHPのタスクは非常にシンプルな仕組みなので、ちょっとモデルの実装を確認するときなどにも割と重宝するときもあります(すべてにテストがかければいいんですけど。。)。

サンプルのタスクが、あるので実行してみます。

$ oil r robots

                    "KILL ALL HUMANS!"
                      _____     /
                     /_____\
                ____[\*---*/]____
               /\ #\ \_____/ /# /\
              /  \# \_.---._/ #/  \
             /   /|\  |   |  /|\   \
            /___/ | | |   | | | \___\
            |  |  | | |---| | |  |  |
            |__|  \_| |_#_| |_/  |__|
            //\\  <\ _//^\\_ />  //\\
            \||/  |\//// \\\\/|  \||/
                  |   |   |   |
                  |---|   |---|
                  |---|   |---|
                  |   |   |   |
                  |___|   |___|
                  /   \   /   \
                 |_____| |_____|
                 |HHHHH| |HHHHH|

アスキーアートのロボットが表示されます。”KILL ALL HUMANS!”。。。w

タスクの実行は、oilコマンドにクラス名を指定します。
(つまり migrate などは fuel/core/tasks に含まれるタスクになっています)

タスククラスの書き方は fuel/app/tasks ディレクトリに、namespace “Fuel\Tasks” を指定したクラスを定義します。
処理は、タスククラスのインスタンスメソッドに実装します。

// fuel/app/tasks/greeting.php
namespace Fuel\Tasks;

class Greeting
{

    public function run($message = 'Hey', $name = "Guys")
    {
        echo $message." ".$name."!\n";
    }

    public function goodMorning($name = "Guys")
    {
        echo $this->run("Good morning", $name);
    }
}

この例では、run メソッドと goodMornig というメソッドを実装しています。

また、Oilコマンドに、タスクの生成コマンドも用意されています。
タスク – Generate – Oil パッケージ – FuelPHP ドキュメント
このタスクを生成する場合は以下のようにoilコマンドを実行します。

$ oil g task greeting goodMorning
        Preparing task method [GoodMorning]
    Creating tasks: /path/fuel/app/tasks/greeting.php

タスクの実行は、タスク名のみだと run メソッドが実行されます。
一方、run 以外の名前のメソッドを実行するには”:”に続けてメソッド名を指定します。
また、このタスクの run メソッドには引数が2つありますが、引数はタスク名に続けて空白区切りで指定します。

$ oil r Greeting
Hey Guys!
$ oil r Greeting "Good night" John!
Good night John!!
$ oil r Greeting:goodMorning
Good morning Guys!
$ oil r Greeting:goodMorning Bob
Good morning Bob!

補足になりますが、タスクの中でモデルを呼び出す場合は、タスクのネームスペースが “Fuel\Tasks” に指定されているので、グローバルから指定する必要があります。
例えば、Greetingのロジックをモデルに移した場合。

<?php
// fuel/app/classes/model/greeting.php
class Model_Greeting
{
    public static function hey($message = 'Hey', $name = "Guys")
    {
        echo $message." ".$name."!\n";
    }
}
// fuel/app/tasks/greeting.php
namespace Fuel\Tasks;

class Greeting
{

    public function run($message = 'Hey', $name = "Guys")
    {
        \Model_Greeting::hey($message, $name);
    }
}
$ oil r Greeting
Hey Guys!
,