2012-02-04 49 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之间共享功能在语义上是错误的。

如果需要的常用功能,这是更清晰,整洁,以把它放在一个单独的类,把这个类在你的供应商文件夹,然后将代码导入控制器和外壳两者。

此外,这种方法不会阻止您创建的组件和使用的核心功能,然后分享这些组件和任务的控制器和壳之间的任务。