2012-02-04 46 views
5

我正在嘗試爲我的應用程序使用cakephp shell來執行任務。該任務涉及運行長時間運行的進程(因此需要使用shell)。使用CakePHP + Shell中的組件

功能要求我使用了一個名爲CommonComponent

組件內部的功能不幸的是,每當我嘗試包括我得到以下錯誤 PHP的致命錯誤的組件:類「組件」在/ var/WWW未找到/nginx-test/app/Controller/Component/CommonComponent.php

這裏是CronShell類,這是被稱爲

class CronShell extends AppShell { 
    public function main() { 
     $this->out('Hello world.');  
// $this->out(phpinfo()); 
    } 
    public function test() 
    { 
     $this->out('Before Import'); 
     App::import('Component', 'Common'); 
     $this->out('Import complete'); 
     // $this->Common=ClassRegistry::init('CommonComponent'); 
     $this->Common =new CommonComponent(); 
     $this->out('Initialization complete'); 
     $this->Common->testCron(); 
     $this->out('FunctionCall complete'); 
     //$this->Common->saveCacheEntry("name","value"); 
    } 
    } 

的CommonComponent類被存儲爲應用程序/控制器/元件及ent/CommonComponent.php,如下所示

class CommonComponent extends Component 
{ 
function testCron() 
    {  
    $this->out('Hello world from Component.'); 
    } 
} 

任何想法?

+0

考慮更新接受的答案嗎? – 2013-04-23 20:28:04

回答

0

您導入外殼應該用什麼代碼從你的應用程序庫中

組件也可以利用庫代碼的 - 但你不必做繁瑣的東西 如果你設定的負載它的權利,你會讓你的應用更清潔

如果導入組件,您需要傳遞一個組件集合,所以你不得不做出從witin外殼不是你使用它(或者,如果你你必須這樣做是錯誤)

+0

移動從零部件的通用代碼到lib文件夾worked.I內CLAS我仍然困惑於什麼樣的代碼應該bcome該庫的一部分,什麼樣的代碼應該是一個組件 – 2012-02-09 19:03:08

+0

@Zulubaba你有一些代碼,看看要麼粘貼到的一部分bin.cakephp.org或粘貼一些其他地方。 我可以欣賞你的困惑,但除了說Mark Story的資產壓縮能做到這一點之外,看不出代碼。資產壓縮使用shell和輔助這兩個源類從庫(具體以插件額外的配置方向是由兩個使用) 我需要更多地瞭解你常見的補償,並可以從那裏 – sam 2012-02-12 18:15:14

0

你有沒有在你的文件,EV的頂部試圖App::uses('Component', 'Controller');。在導入CommonComponent之前?那麼我想你需要做什麼山姆說,或者你可以使用$this->Controller->Components->load('CommonComponent'),但爲此,你需要構建控制器類。

15

我不得不最近用我寫的MTurk組件做這個。我的最終解決方案是使用lib而不是組件。然後我讓組件訪問這個lib,這樣我就可以使用來自組件和shell的方法。

然而,這裏是代碼,讓你從一個shell加載組件。

<?php 
App::uses('AppShell', 'Console/Command'); 
App::uses('ComponentCollection', 'Controller'); 
App::uses('Controller', 'Controller'); 
App::uses('MTurkComponent', 'Controller/Component'); 

class ProcessCompletedTask extends Shell { 
    public function execute() { 
     $this->out("Processing...\n"); 
     $collection = new ComponentCollection(); 
     $this->MTurk = new MTurkComponent($collection); 
     $controller = new Controller(); 
     $this->MTurk->initialize($controller); 

     $this->MTurk->processHITs(); 
     $this->out("Complete\n"); 
    } 
} 
+0

這工作建議,但我得到$控制器爲空的警告。要解決此警告,加上'應用::使用(「控制」,「控制」)'和'修改$控制器=新的控制器()' – Eldelshell 2013-10-31 11:10:45

+0

@Ubersoldat您使用的是什麼版本的蛋糕?我想,我寫了這2.0 – 2013-10-31 12:03:05

+0

最新的在這一刻:2.4 – Eldelshell 2013-11-01 13:02:36

0

我相信在控制器和shell之間共享功能在語義上是錯誤的。

如果需要的常用功能,這是更清晰,整潔,以把它放在一個單獨的類,把這個類在你的供應商文件夾,然後將代碼導入控制器和外殼兩者。

此外,這種方法不會阻止您創建的組件和使用的核心功能,然後分享這些組件和任務的控制器和殼之間的任務。