2013-07-16 57 views
0

更新 - 我能夠加入application.controllers解決這個*到config/console.php像這樣:Yii命令行 - 如何初始化我的整個Web應用程序並通過yiic調用其他控制器操作?

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

然後調用CLI命令的操作是這樣的:

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

我在保護/命令/簡單的yiic命令dBManagerCommand.php,我可以在命令行運行:

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; 
    } 
} 

運行它產生的followi ng錯誤。顯然它找不到我的其他控制器。我想在我的應用程序的其餘部分從現有控制器運行方法。這是從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界面的所有控制器,但是爲此目的它解決了這個問題並且工作正常。導入方法最初通過控制器請求請求,但隨後調用適用於db和文件系統級邏輯和操作的模型方法。 (是的,我確實有其他專門用於此目的的導入模型類,主要是因爲Yii中與行爲有關的內存泄漏)。

一個人不應該在控制器中做任何邏輯的想法是錯誤的,imo。在這種情況下,我選擇在進行輸入過濾邏輯的控制器中創建導入方法,因爲用戶(人類或cron)需要提交大量輸入,並且這需要在我們到達將文件解析到數據庫的任務。此控制器導入方法根據用戶輸入解析文件並將預過濾的數據傳遞給模型方法。我選擇這樣做是因爲文件輸入數據實際上是不可信用戶輸入,我需要根據用戶請求參數進行一些預處理。是的,你可以在模型方法中做到這一點,但它會導致模型中的處理請求數據或者傳遞大量參數和數據,這很麻煩並增加了內存使用量。

回答

0

這樣的問題通常是次優體系結構的標誌。我想說,在使用MVC框架時,在控制器中有太多與模型相關的代碼是開發人員最常犯的錯誤之一。

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

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

類似這樣的解耦類增加了很多重用性:現在可以使用該模型方法或從兩者中導入類,控制器操作和CLI命令。

+0

對於從cron作業運行某些東西的後端目的,我看到加載所有控制器沒有問題。它解決了這個問題。 – glyph

+0

另請參閱上面的更多信息... – glyph

+0

Yii中的控制器用於處理Web請求。他們將模型連接到視圖。他們不是爲了消毒輸入。當你調用'setAttributes()'或'validate()'時,這就是模型中發生的事情。 –

相關問題