CakePHP 3控制器事件实现示例

时间:2016-04-03 23:55:18

标签: cakephp-3.0 cakephp-3.x

CakePHP 3.0文档包含一个使用模型创建事件的示例作为示例。我尝试过并试过,但这并不代表我。有没有人有一个使用自定义事件的CakePHP 3.x示例,其中控制器在触发事件的控制器中设置变量?

1 个答案:

答案 0 :(得分:2)

假设我们有一个管理仪表板,您希望将一些代码注入到使用事件中,以便您可以将插件而非特定插件的硬编码仪表板功能分离到核心管理仪表板中。

创建活动的解雇。

  

在APP / Controller / DashboardController中

public function index()
{
    // Once this gets to the function triggered by this event, the "$this" in the parameters will be $event->subject(). Mentioned again below.
    $event = new Event('Controller.Dashboard.beforeDashboardIndex', $this)
    $this->eventManager()->dispatch($event);
    // your other index() code...
}

现在创建一个等待触发该事件的侦听器

  

这个好地方可能是PluginName / src / Controller / Event / DashboardListener.php

namespace Plugin\Controller\Event;

use Cake\Event\EventListenerInterface;

class DashboardListener implements EventListenerInterface {

    public function implementedEvents() {
        return array(
            'Controller.Dashboard.beforeDashboardIndex' => 'myCustomMethod',
        );
    }

    public function myCustomMethod($event) {
        // $event->subject() = DashboardController();
        $event->subject()->set('dashboardAddon', 'me me me');
    }
}

最后打开侦听器。 (例如,在APP / config / bootstrap.php的底部)

  

注意,此侦听器初始化可以是在DashboardController :: index

之前触发的任何位置
// Attach event listeners
use Cake\Event\EventManager;
use PluginName\Controller\Event\DashboardListener;
$myPluginListener = new DashboardListener();
EventManager::instance()->on($myPluginListener);