0

更新 - 次のように application.controllers.* を config/console.php に追加することで、これを解決できました。

'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.controllers.*',
        'application.extensions.CAdvancedArBehavior',
        'application.extensions.eUploadedImage.*',
       ),

次に、次のように cli コマンドでアクションを呼び出します。

$myCtrl=new CopyNumberNewSegController(NULL);
$myCtrl->actionBatchImport($libraries,$action);

コマンドラインから実行できる protected/commands/dBManagerCommand.php に単純な yiic コマンドがあります。

class DBManagerCommand extends CConsoleCommand
{
    public $verbose=false;
    public $divider="--------------------------------------------------------------------------\n";
    public $title="DB Manager Command\n";
    public function actionImportAnalysis($libraries=false,$action='incomplete') {
        echo $this->divider;
        echo $this->title;
        echo $this->divider;
        echo 'Importing '.$action ." analysis data from file system...\n";
        echo $this->divider;

        switch ($action) {

            case 'incomplete':

                CopyNumberNewSegController::batchImport($libraries,$action);


                break;
        }

        return 0;
    }
}

実行すると、次のエラーが発生します。どうやら他のコントローラーが見つからないようです。アプリケーションの残りの部分で、既存のコントローラーからメソッドを実行したいと考えています。これは bash シェルから実行されます (コードの色は無視されます)。

yiic dbmanager importAnalysis --action=incomplete
--------------------------------------------------------------------------
DB Manager Command
--------------------------------------------------------------------------
Importing incomplete analysis from file system...
--------------------------------------------------------------------------
PHP Error[2]: include(CopyNumberNewSegController.php): failed to open stream: No such file or directory
    in file /var/www/html/mioncoseq/pub/framework/YiiBase.php at line 418
#0 /var/www/html/mioncoseq/pub/framework/YiiBase.php(418): autoload()
#1 unknown(0): autoload()
#2 /var/www/html/mioncoseq/pub/protected/commands/dBManagerCommand.php(21): spl_autoload_call()
#3 unknown(0): DBManagerCommand->actionImportAnalysis()
#4 /var/www/html/mioncoseq/pub/framework/console/CConsoleCommand.php(141): ReflectionMethod->invokeArgs()
#5 /var/www/html/mioncoseq/pub/framework/console/CConsoleCommandRunner.php(65): DBManagerCommand->run()
#6 /var/www/html/mioncoseq/pub/framework/console/CConsoleApplication.php(91): CConsoleCommandRunner->run()
#7 /var/www/html/mioncoseq/pub/framework/base/CApplication.php(162): CConsoleApplication->processRequest()
#8 /var/www/html/mioncoseq/pub/framework/yiic.php(33): CConsoleApplication->run()
#9 /var/www/html/mioncoseq/pub/protected/yiic.php(7): require_once()
#10 /var/www/html/mioncoseq/pub/protected/yiic(4): require_once()

それでは、これらのコントローラーメソッドをどのようにロードできますか? これらのコントローラーファイルを手動で含めようとせずに、アプリ全体を初期化する適切な方法があると確信しています。

みんな、ありがとう!


以下の MVC アーキテクチャの誤用に関する批判に応えて、コメント フィールドが十分に長くないため、この応答をここに貼り付けます。

まず、Web インターフェイス用のすべてのコントローラーをプリロードするわけではありませんが、この目的のために問題を解決し、正常に動作します。import メソッドは、最初はコントローラーを介してリクエストを受け取りますが、その後、db およびファイル システム レベルのロジックと操作に適したモデル メソッドを呼び出します。(そして、主に Yii の動作関連のメモリ リークのため、この目的専用のインポート モデル クラスが他にもあります)。

コントローラーでロジックを実行してはならないという考えは、まったく間違っています。この場合、入力フィルタリング ロジックを実行するコントローラーでインポート メソッドを作成することにしました。これは、ユーザー (人間または cron) が送信する必要がある多数の入力があり、これは、ファイルをデータベースに解析するタスク。このコントローラーのインポート メソッドは、ユーザー入力に基づいてファイルを解析し、事前にフィルター処理されたデータをモデル メソッドに渡します。ファイル入力データは実際には信頼できないユーザー入力であり、ユーザー要求パラメーターに基づいて前処理を行う必要があったため、これを選択しました。はい、モデルメソッドでこれを行うことができますが、モデルでリクエストデータを処理するか、大量の引数とデータを渡すことになり、面倒でメモリ使用量が増加します。

4

1 に答える 1