Monday, March 3, 2008

コマンドラインから実行

コマンドラインからCIのコントローラ経由で実行できるようにする。

CIそのままでは引数によるコントローラ、メソッドのマッピングができないのだが、今後使う必要が出てきそうなのでいじってみる。

処理を追ってみると、CodeIgniter.php 内で pre_system フックの後に CI_Router クラスの読み込みを行っている。
CI_Router クラス内では $_SERVER の値によりコントローラとメソッドの選択を行っているので、無理矢理だがそこを書き換えることで動作の制御ができそう。

1. system/applications/config/hooks.php に以下を追加。
$hook['pre_system'] = array(
'class' => 'CLI',
'function' => 'set_route',
'filename' => 'CLI.php',
'filepath' => 'hooks',
'params' => null
);


2. system/applications/hooks/ 内に 1.で指定した名称のクラスファイルを作成し、以下のコードを保存。
<?php

class CLI
{
public function set_route()
{
if (php_sapi_name() != "cli") return;

if ((array_key_exists("argv", $_SERVER)))
{
$argv = $_SERVER["argv"];
array_shift($argv);
$_SERVER["PATH_INFO"] = "/" . implode("/", $argv);
}
}
}

?>


3. 実行するときはこんな感じで。
$ php index.php controller method data


TODO: $config['uri_protocol'] の設定によって $_SERVER のキーを変える必要がある。上のコードであればAUTOもしくはPATH_INFOを指定すればとりあえず動くはず。

No comments: