14835


データベースのとあるテーブルにTask名を格納しておき  
シェル内でそのデータを読み込みそこに書かれたTaskを実行する処理を書きたいのですが  
動的にTaskを読み込み、実行する事は可能でしょうか。

いくつか試してみたのですが、まずTaskの読み込みを空の配列  
public $tasks = array();  
にしておきシェルの処理内で上書きしてもTaskは呼ばれず、

またこのやり方だと実行する際の  
$this->Task名->execute();  
にてTask名の部分をどう記述すれば良いかが分かりませんでした。

どのように記述すれば動的なTaskの呼び出しが出来るか教えて頂けないでしょうか。  
よろしくお願い致します。


CC BY-SA 3.0
2015-08-25T11:34:32.730
14829
2015-08-25T13:26:21.280
11050
question
cakephp
CakephpのTaskを動的に呼び出したい


基本的には [Cookbook コンソールとシェル：シェルのタスク](http://book.cakephp.org/2.0/ja/console-and-
shells.html#id4) に書かれている方法に準拠すればできるはずです。

## パターン1：

呼び出し側の`$tasks`は単にインスタンス化するクラスを定義しておくだけのものですから、定義してあるTaskクラスを最初から静的にすべて羅列しておいても、さほど支障はないでしょう。

[code]

    public $tasks = array('TaskA', 'TaskB', 'TaskC');
    
[/code]

その上で実行時のタスククラス名に関しては次の構文を使えば動的に文字列で指定できます。これはCakeは関係なくPHP自身の機能です。

[code]

    $taskClassName = 'TaskB';
    $this->{$taskClassName}->execute();
    
[/code]

なお、

> いくつか試してみたのですが、まずTaskの読み込みを空の配列  
>  `public $tasks = array();`  
>  にしておきシェルの処理内で上書きしてもTaskは呼ばれず、

$tasksの内容はシェルクラスの起動時に一度参照されるだけなので、ユーザが定義するメソッドの中で追加しただけでは効果がありません。追加した後に明示的に

[code]

    $this->loadTasks();
    
[/code]

を呼び出すことで認識されるようになるはずです。

## パターン2：

関係のないタスククラスまで常にインスタンス化されては困るというのであれば、

[code]

    $taskClassName = 'TaskC';
    $taskClass = $this->Tasks->load($taskClassName);
    $taskClass->execute();
    
[/code]

の形で、都度インスタンス化して実行すればよいと思います。

なお上記のコード例では読み込むタスククラス名を直接書いてますが、そこをDBから読み込むように差し替えて考えてください。


CC BY-SA 3.0
2015-08-25T12:54:10.747
14835
2015-08-25T13:26:21.280
2015-08-25T13:26:21.280
10492
10492
14829
answer