簡體   English   中英

如何在 Cakephp2 中為 controller 注冊事件監聽器?

[英]How to register event listeners for a controller in Cakephp2?

我想在 cakephp2.10 中從我的 controller 調度一個事件。 因此我需要為 controller 注冊事件監聽器。 當事件從我的 model 發出時,很容易實現這一點,但我無法為我的 controller 弄清楚。 從書中: https://book.cakephp.org/2/en/core-libraries/events.html#global-event-manager

App::uses('ClassRegistry', 'Utility');
App::uses('UserEventsListener', 'Lib/Event');
$User = ClassRegistry::init('User');
$User->getEventManager()->attach(new UserEventsListener());

對於控制器來說會是這樣,還是我只能對控制器發出的事件使用全局事件?

App::uses('TestController', 'Controller');
$test = new TestController();
$test->getEventManager()->attach(new TestEventsListener());

我還為 cakephp3 看到了這個: CakePHP 3 Controller 事件實現示例,但我不確定如何將它用於 cakephp2.x。 謝謝

你永遠不應該手動實例化 controller(可能在單元測試中除外),如果你覺得有必要這樣做,那么這表明你的應用程序架構中可能存在缺陷。

與模型不同,每個請求只能涉及一個 controller(如果有多個,這將再次表明存在架構缺陷),因此理想情況下,您應該沒有理由將偵聽器附加到特定的 controller 實例。

我會說 go 並說如果您有多個調度該事件的控制器,但您只想聽其中一個,那么這又是一個可能的架構缺陷,很可能通過確定事件范圍來解決正確地在特定的 controller 中,例如使用特定的 controller 名稱,如Controller.Test.myEvent 在您的聽眾中,您還可以檢查主題是否是特定實例,但如果聽眾需要對主題了解那么多,那可能不太好。

話雖如此,是的,請改用全局事件管理器,它與鏈接答案中的主體相同,例如:

// In app/Lib/Event/TestEventsListener.php
App::uses('CakeEventListener', 'Event');

class TestEventsListener implements CakeEventListener {

    public function implementedEvents() {
        return array(
            'Controller.Test.myEvent' => 'testScopedMyEvent',
        );
    }

    public function myEvent($event) {
        // testScopedMyEvent happend, do something...
    }
}

然后在您的 controller 中相應地調度您的事件:

$event = new CakeEvent('Controller.Test.myEvent', $this, array(
    'some' => $eventData
));
$this->getEventManager()->dispatch($event);

也可以看看

這是我的錯誤。 我試圖實例化 controller 以附加偵聽器,但我應該這樣做:

CakeEventManager::instance()->attach(new TestListener());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM