LoginSignup
8
8

More than 5 years have passed since last update.

FuelPHPのタスクをコントローラーからも実行する

Posted at

CSVを作るとか、サイトマップを作るとか、再利用性のある処理はいつもタスクに書いてしまいます。
そのタスクをコントローラーからでもモデルからでも呼べれば、「ブラウザのボタンクリックでCSVをDLする」ような処理をどこにでも簡潔に記述できそうです。

やってみる

fuel/app/classes/controller/item.php
public function post_download()
{
    $time = \Date::forge()->get_timestamp();
    $path = APPPATH.'tmp/export/item/'.$time.'.csv';

    //
    \Package::load('oil');

    $bf= \Fuel::$is_cli;
    \Fuel::$is_cli =true;
    $_SERVER['argc'] = 1;
    Oil\Refine::run('export_items', array($path) );
    \Fuel::$is_cli = $bf;

    if( file_exists($path) ){
        File::download($path,sprintf('item-%s.csv',date('Ymd_Hi',$time)));
    }
}

できた

ポイントは、

  • \Fuel::$is_cliを偽装してCLI実行を装う(後で戻す)
  • 引数の数をargcで指定する

だがしかし

タスクは、戻り値がとれないので、タスク内でエラーが出てもよくわからないし、結果も取得できません。
なので、ファイルの場所を引数で指定するとか、結果を得る工夫は必要です。

あと、タスク内でechoとかされると画面に出力されてしまうので、ob_start()するなりして回避しないとかもしれないです。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8