如何在Tasks中使用CakePHP组件代码?

时间:2011-07-21 05:11:57

标签: cakephp cakephp-1.3

我在CakePHP任务中有一些我想要的组件代码,但我不确定我是否以正确的方式引导Controller。

作为简化版本,我有两个组件,通过扩展的AppController访问时运行正常。一个组件包括另一个组件,因为它调用另一个组件。

第一部分:

class BigBrotherComponent extends Object {

    var $Controller = null;

    var $components = array('Sibling');

    function startup(&$controller) {
        $this->Controller =& $controller;
    }

    function doThis() {
       $this->Controller->loadModel('SampleModel');
       $this->Sibling->doThat();
    }
 }

第二部分:

class SiblingComponent extends Object {

    var $Controller = null;

    function startup(&$controller) {
        $this->Controller =& $controller;
    }

    function doThat() {
        /* Doing stuff */
    }
 }

为了让我从命令行操作它,我定义了一个Shell和一个Task。这是任务,虽然我不确定我做得对。

App::import('Core', 'Controller');
App::import('Component', 'Session');
App::import('Component', 'BigBrother');

class BigBrotherTask extends Shell {
    var $Controller; 
    var $BigBrother;

    function initialize() {
        $this->Controller =& new Controller();

        // add session to controller, because some components access $this->Controller->Session->setFlash();
        $this->Controller->Session =& new SessionComponent();
        $this->Controller->Session->startup($this->Controller);

        // Initialise the component
        $this->WordToText =& new WordToTextComponent();
        $this->WordToText->startup($this->Controller);
    }

    function doThat() {
        $this->BigBrother->doThat();
    }

}

当BigBrother组件不包含任何自己的组件时,或者在BigBrother组件中引用Controller之外的任何其他组件时,此类任务很有效。正如您所看到的,我不得不为Session组件做一些轻微的讨厌。

是否有更好的方法来初始化和使用任务中的组件,这将正确初始化组件和子组件?

1 个答案:

答案 0 :(得分:2)

我相信我已经想出了一个更好的方法,但仍然不确定这是否是最佳方式。

首先,组件需要通过initialize()方法设置控制器。这可确保在通过控制器或其他组件加载组件时分配控制器。 startup()不会为其他组件加载的组件运行。

因此,组件应具有以下内容

function initialize(&controller, $settings = null) {
    $this->Controller =& $controller;
}

使控制器和组件初始化更像调度员所做的下一步。

App::import('Core', 'Controller');

class BigBrotherTask extends Shell {
    var $Controller; 

    function initialize() {
        $this->Controller =& new Controller();
        $this->Controller->components = array('Session', 'WordToText');
        $this->Controller->uses = null;

        $this->Controller->constructClasses();
        $this->Controller->startupProcess();
    }

    function doThat() {
        $this->Controller->BigBrother->doThat();
    }

}

任务似乎没有关闭作为其流程的一部分,因此如果您的组件需要正确关闭,则必须在任务函数结束时或在命令行管理程序中对其进行编码。