我在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组件做一些轻微的讨厌。
是否有更好的方法来初始化和使用任务中的组件,这将正确初始化组件和子组件?
答案 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();
}
}
任务似乎没有关闭作为其流程的一部分,因此如果您的组件需要正确关闭,则必须在任务函数结束时或在命令行管理程序中对其进行编码。