簡體   English   中英

Yii命令行-如何初始化我的整個Web應用程序並通過yiic調用其他控制器動作?

[英]Yii Command line - How to initialize my entire web app and call other controller actions via yiic?

更新-我能夠通過將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 shell運行的(忽略代碼顏色)

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)需要提交大量輸入,並且這需要在我們進入將文件解析到數據庫中的任務。 該控制器導入方法根據用戶輸入來分析文件,並將預先過濾的數據傳遞給模型方法。 我之所以選擇這樣做,是因為文件輸入數據實際上是不受信任的用戶輸入,並且我需要根據用戶請求參數進行一些預處理。 是的,您可以在模型方法中執行此操作,但這將導致在模型中處理請求數據,或傳遞大量參數和數據,這很麻煩,並且會增加內存使用量。

通常,此類問題表明體系結構欠佳。 我想說的是,在使用MVC框架時,控制器中有太多與模型相關的代碼是開發人員最常犯的錯誤之一。

假設您的代碼將從文件(或某些其他數據源)中批量導入數據。 這是一個模型任務! 因此,您應該在相關的模型類中編寫一個方法,例如, public static import($filename) 在該方法內部,您還應避免與其他組件緊密耦合(例如,CLI中不可用的Yii::app()->user )。

如果這是一項更復雜的任務,您甚至可以為導入編寫一個專用的類。 該類可以表示導入作業,並提供諸如import()getError()來獲取導入的錯誤狀態。

這樣的解耦類可以大大提高可重用性:現在,您可以使用該模型方法或從控制器操作和CLI命令中導入類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM