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でも、似たような流れで同じことができますので、興味がある方はどうぞ。