案件の事情により、CodeIgniterをCLIからもWEBからも利用しなければならないという問題にぶち当たる。

CodeIgniterでは、
system/libraries/Router.php
で実行するコントローラとメソッドを指定しているので、これを拡張してやれば、行ける気がする。

今回のコマンドは、

index.php "ディレクトリ" "クラス" "実行するメソッド"

と指定することにした。

まず、Router.phpの拡張を作る。
system/application/libraries/MY_Router.php
を作成し、そのなかに以下のようなクラスを作成する。

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class EB_Router extends CI_Router{
 
//ここに後述のメソッドを書く。
 
}
?>

「//ここに後述のメソッドを書く。」の部分に後述のメソッドを書きます。


続いて、コマンドライン引数からコントローラーなどを指定するメソッドを拡張します。
system/libraries/Router.php
の「_validate_request」メソッドを、
system/application/libraries/MY_Router.php
へコピーします。

そして、このメソッドの冒頭へ、
CLIでの起動だった場合に、コマンドラインからコントローラーを指定するコードを書きます。
 

function _validate_request($segments){

/**********************************************************/
if( PHP_SAPI == 'cli' )
{
    
    //ここでコントローラーなどを指定。
    $this->set_directory($_SERVER['argv'][1]);
    $this->set_class($_SERVER['argv'][2]);
    $this->set_method($_SERVER['argv'][3]);
    
    //カレントディレクトリを変更しておく
    chdir( FCPATH );
    
    return array();
}
/**********************************************************/

// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
{
    return $segments;
}

// Is the controller in a sub-folder?
if(is_dir(APPPATH.'controllers/'.$segments[0]))
{ 
    
    // Set the directory and remove it from the segment array
    $this->set_directory($segments[0]);
    $segments = array_slice($segments, 1);
    
    if (count($segments) > 0)
    {
        // Does the requested controller exist in the sub-folder?
        if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
        {
            show_404($this->fetch_directory().$segments[0]);
        }
    }
    else
    {
        $this->set_class($this->default_controller);
        $this->set_method('index');
        
        // Does the default controller exist in the sub-folder?
        if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
        {
            $this->directory = '';
            return array();
        }
    }
    return $segments;
}

// Can't find the requested controller...
show_404($segments[0]);
}

/**********************************************************/
で囲まれた部分が追加した部分です。

これで、コマンドからコントローラーやメソッドを指定できます。

定義済み定数の「PHP_SAPI」に「cli」が指定されたとき以外は、
通常のルーティングが行われるので、
CLIとWEBでハイブリッドな使い方ができそうです。


注意点としては、
上記のコードは、コマンドから渡された、
ディレクトリやらコントローラーやらメソッドが、
確実に存在するという前提で書いています。
実際に使う場合は、このへんのエラートラップもしておいたほうがいいでしょう。

拡張のヒントとしては、上記のコードでは、第4引数以降はと特になにもしていないですが、
ここも拾って、実行メソッドの引数として渡せると楽しいかもです。

何かの参考になればー。