necotech blog

FuelPHPで、標準のTaskを使わずにコマンドラインから実行できるツールを作るメモ

FuelPHPにて、oilやTaskを使わずにコマンドラインからアプリケーションを実行させたいことがあったので、システムだけを読み込んで、ルーティング処理を無視する方法を試してみました。コマンドラインから実行できるので、もちろんcronでも使えます。
ちなみに今回試したバージョンは1.7です。

準備

単純ですが、下記のような構成を考えます。別の場所に置く場合は、ディレクトリパスの修正を適宜読み替えてください。

[実行ファイル]
/path/to/fuel/tasks/tool.php

[システムローダ]
/path/to/fuel/tasks/init.php

システムローダをつくる (tasks/init.php)

要はpublic/index.phpが読み込んでいる処理をそのまま流用すればいいので、まず、index.phpを上記のinit.phpにコピーします。

読込パスの修正

次に、各ディレクトリのパスを修正します。長いのでコメント部分は省略しています。

define('APPPATH', realpath(__DIR__.'/../fuel/app/').DIRECTORY_SEPARATOR);
define('PKGPATH', realpath(__DIR__.'/../fuel/packages/').DIRECTORY_SEPARATOR);
define('COREPATH', realpath(__DIR__.'/../fuel/core/').DIRECTORY_SEPARATOR);

define('APPPATH', realpath(__DIR__.'/../app/').DIRECTORY_SEPARATOR);
define('PKGPATH', realpath(__DIR__.'/../packages/').DIRECTORY_SEPARATOR);
define('COREPATH', realpath(__DIR__.'/../core/').DIRECTORY_SEPARATOR);
ルーティング処理の削除

53-83行目以降の、ルーティング(コントローラの制御)処理を削除します。

// Exception route processing closure
$routerequest = function($route = null, $e = false)
{
// ...

  return $response;
};

85-105行目で、bootstrap.phpを読み込んでルーティングを実行しているので、bootstrap.phpの読み込みだけ残して削除します。また、そこから下はHTTPレスポンスの処理なので全て丸ごと削除します。

// Generate the request, execute it and send the output.
try
{
  // Boot the app...
  require APPPATH.'bootstrap.php';

//...

// Send the output to the client
$response->send(true);

// Boot the app...
require APPPATH.'bootstrap.php';

これで、FuelPHPのシステムだけ読み込むことができるようになりました。
tasks/init.phpのソース


実行したいツールをつくる (tasks/tool.php)

上記init.phpを読み込めば、FuelPHP上で開発した機能をそのまま利用できるようになります。

<?php

require_once dirname(__FILE__) . "/init.php";

$users = Model_User::query()->get();
foreach($users as $user){
  echo "{$user->id}: {$user->name}\n";
}
$ pwd
/path/to/fuel

$ php tasks/tool.php
1: admin
2: user1
3: user2

以上で完成です。思ったより簡単にできました。僕の開発しているWebフレームワークPachiraでも、似たような流れで同じことができますので、興味がある方はどうぞ。

Facebook にシェア
LinkedIn にシェア
Pocket