【问题标题】:How to code CakePHP components when used in Tasks?在 Tasks 中使用 CakePHP 组件时如何编写代码?
【发布时间】:2011-07-21 05:11:57
【问题描述】:

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

作为一个简化版本,我有两个组件在通过扩展的 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 组件做一些小事。

有没有更好的方法来初始化和使用任务中的组件,可以正确初始化组件和子组件?

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案1】:

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

    首先,组件需要通过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();
        }
    
    }
    

    任务似乎没有将关闭作为其流程的一部分,因此如果您的组件需要正确关闭,您必须在 Task 函数的末尾或在 Shell 中对其进行编码。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多