CakePHP 3.x:在控制器上即时加载组件

时间:2016-08-05 18:01:56

标签: cakephp cakephp-3.x

我正在尝试在控制器上动态加载组件。 该组件有startup()方法,我知道必须手动调用它,因为组件已加载到操作中。

public function startup(\Cake\Event\Event $event) {
    //do something...
}

进入控制器:

$this->loadComponent('MyComponent');
$this->MyComponent->startup();

然而,这会产生警告,因为$event参数未通过。我该如何通过?

3 个答案:

答案 0 :(得分:1)

根据当前操作

加载组件

对于更简单且可能更不容易出错的内容,您可能需要考虑根据当前操作在控制器initialize()方法中加载组件,例如

if ($this->request->param('action') === 'theAction') {
    $this->loadComponent('TheComponent');
}

伪造控制器事件

我个人不建议这样做,但为了完整起见...

startup()Controller.startup事件的回调。你可以很容易地伪造这个事件,但它可能不是一个好主意,因为对事件的操作不会产生与实际的,真实的控制器启动Controller.startup事件时相同的效果。参见

<强> \Cake\Controller\Controller::startupProcess()

结果用于调度过程。因此,如果一个组件试图摆弄它,事情将没有任何效果,这可能会导致进一步的问题。

另外请不要忘记还有Controller.initialize映射到beforeFilter()回调,当加载迟到的组件时,你也会错过这个回调。

因此,请注意这些问题,以及在实际调用操作之前可能需要执行操作的组件可能产生的进一步副作用。考虑到这一点,这是一个基本的例子,包括处理事件重新启动。

$event = new \Cake\Event\Event('Controller.initialize', this);
$this->TheComponent->beforeFilter($event);
if ($event->result instanceof \Cake\Network\Response) {
    return $event->result;
}

$event = new \Cake\Event\Event('Controller.startup', this);
$this->TheComponent->startup($event);
if ($event->result instanceof \Cake\Network\Response) {
    return $event->result;
}

答案 1 :(得分:0)

尝试传递$this

$this->MyComponent->startup($this);

我认为这个帖子解释了你的问题。

https://github.com/chronon/CakePHP-StripeComponent-Plugin/issues/4#issuecomment-30599742

答案 2 :(得分:0)

解决方案正在传递search。感谢。

所以,进入控制器:

$this
相关问题