国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

event事件處理

webman/event 提供一種精巧的事件機(jī)制,可實(shí)現(xiàn)在不侵入代碼的情況下執(zhí)行一些業(yè)務(wù)邏輯,實(shí)現(xiàn)業(yè)務(wù)模塊之間的解耦。典型的場(chǎng)景如一個(gè)新用戶注冊(cè)成功時(shí),只要發(fā)布一個(gè)自定義事件如user.register,各個(gè)模塊遍能收到該事件執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。

安裝

composer require webman/event

訂閱事件

訂閱事件統(tǒng)一通過文件config/event.php來配置

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...其它事件處理函數(shù)...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...其它事件處理函數(shù)...
    ]
];

說明:

  • user.register user.logout 等是事件名稱,字符串類型,建議小寫單詞并以點(diǎn)(.)分割
  • 一個(gè)事件可以對(duì)應(yīng)多個(gè)事件處理函數(shù),調(diào)用順序?yàn)榕渲玫捻樞?/li>

事件處理函數(shù)

事件處理函數(shù)可以是任意的類方法、函數(shù)、閉包函數(shù)等。
例如創(chuàng)建事件處理類 app/event/User.php (目錄不存在請(qǐng)自行創(chuàng)建)

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

發(fā)布事件

使用 Event::dispatch($event_name, $data);Event::emit($event_name, $data); 發(fā)布事件,例如

<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => 'webman',
            'age' => 2
        ];
        Event::dispatch('user.register', $user);
    }
}

發(fā)布事件有兩個(gè)函數(shù),Event::dispatch($event_name, $data);Event::emit($event_name, $data); 二者參數(shù)一樣。
區(qū)別是emit內(nèi)部會(huì)自動(dòng)捕獲異常,也就是說如果一個(gè)事件有多個(gè)處理函數(shù),某個(gè)處理函數(shù)發(fā)生異常不會(huì)影響其它處理函數(shù)的執(zhí)行。
而dispatch則內(nèi)部不會(huì)自動(dòng)捕獲異常,當(dāng)前事件的任何一個(gè)處理函數(shù)發(fā)生異常,則停止執(zhí)行下一個(gè)處理函數(shù)并直接向上拋出異常。

提示
參數(shù)$data可以是任意的數(shù)據(jù),例如數(shù)組、類實(shí)例、字符串等

通配符事件監(jiān)聽

通配符注冊(cè)監(jiān)聽允許您在同一個(gè)監(jiān)聽器上處理多個(gè)事件,例如config/event.php里配置

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

我們可以通過事件處理函數(shù)第二個(gè)參數(shù)$event_data獲得具體的事件名

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // 具體的事件名,如 user.register user.logout 等
        var_export($user);
    }
}

停止事件廣播

當(dāng)我們?cè)谑录幚砗瘮?shù)里返回false時(shí),該事件將停止廣播

閉包函數(shù)處理事件

事件處理函數(shù)可以是類方法,也可以是閉包函數(shù)例如

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

查看事件及監(jiān)聽器

使用命令 php webman event:list 查看項(xiàng)目配置的所有事件及監(jiān)聽器

注意事項(xiàng)

event事件處理并不是異步的,event不適合處理慢業(yè)務(wù),慢業(yè)務(wù)應(yīng)該用消息隊(duì)列處理,例如webman/redis-queue

編輯于2025-02-06 22:08:54 完善本頁(yè) +發(fā)起討論
贊助商