您好,欢迎访问一九零五行业门户网

Thinkphp事件机制如何实现

事件机制的实现有两种途径:通过监听、通过订阅
一、通过监听1、创建监听类:在命令行模式下进入框架根目录执行
php think make:listener 067c6a584cdcec04cc9164e6f7d9de7b
例如:
php think make:listener userlistener
执行之后将在f50d1e1ebd5a9d7617a38c1e3dc15669\app\listener\下生成userlistener这个类。
2、配置监听:在f50d1e1ebd5a9d7617a38c1e3dc15669\app\event.php这个文件的listen数组中配置userlistener这个类,如下:
'listen'    => [
    'testevent' => ['app\listener\userlistener']
],
3、触发监听:在你需要触发监听的地方加入如下代码
event('testevent');
注意:这里的参数testevent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。
触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到userlistener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。
4、处理监听逻辑:在userlistener类的handle方法中完成业务逻辑
完整代码如下
other:一个用来测试的类
<?phpnamespace app\controller;class other{ public function hello() { echo 'hello function'; }}
index:触发监听的类
<?phpnamespace app\controller;use app\basecontroller;class index extends basecontroller{ public $name = 'index'; public function test1() { //触发监听事件,无参数 event('testevent'); } public function test2() { //触发监听事件,传递字符串 event('testevent', 'hello'); } public function test3() { //触发监听事件,传递自身类 event('testevent', $this); } public function test4() { //触发监听事件,传递其他类 $other = new other(); event('testevent', $other); }}
userlistener:事件监听类
<?phpnamespace app\listener;class userlistener{ /** * 事件监听处理 * * @return mixed */ public function handle($event) { //当调用index类的test1方法时该代码有效,$event为null var_dump($event); //当调用index类的test2方法时该代码有效,$event为字符串hello var_dump($event); //当调用index类的test3方法时该代码有效,$event为index类的实例 //可以访问index类的name变量 echo $event->name; //当调用index类的test4方法时该代码有效,$event为other类的实例 //可以调用other类的hello方法 echo $event->hello(); }}
二、通过订阅1、创建订阅类在命令行模式下进入框架根目录执行
php think make:subscribe <自定义的类名>
例如:
php think make:subscribe usersubscribe
执行之后将在<框架根目录>\app\subscribe\下生成usersubscribe这个类。
2、配置监听在<框架根目录>\app\event.php这个文件的subscribe数组中配置usersubscribe这个类,如下:
'subscribe' => ['app\subscribe\usersubscribe'],
注意:为了测试效果,要把上面配置的userlistener从listen数组删除掉
3、触发监听跟第一种途径一样
4、处理监听逻辑处理监听的逻辑又有两种方法,我称之为自动绑定和手动绑定。手动绑定和自动绑定是互斥的,只能二选一。
4.1 自动绑定完成业务逻辑的ontestevent方法应该被添加到usersubscribe类中。添加的方法名不能随意定义,规则是事件名称前面加上on。因为我们在event.php里定义的事件名称是testevent,所以方法名就是ontestevent(注意大小写)。监听方法定义之后就自动与事件绑定,所以我称之为自动绑定。
完整代码如下
other和index类的代码跟第一种途径一样
usersubscribe:事件订阅类
<?phpnamespace app\subscribe;class usersubscribe{ public function ontestevent($user) { //当调用index类的test1方法时该代码有效,$event为null var_dump($user); //当调用index类的test2方法时该代码有效,$event为字符串hello var_dump($user); //当调用index类的test3方法时该代码有效,$event为index类的实例 //可以访问index类的name变量 echo $user->name; //当调用index类的test4方法时该代码有效,$event为other类的实例 //可以调用other类的hello方法 echo $user->hello(); }}
4.2 手动绑定首先,创建事件类,负责处理具体的业务逻辑。在命令行模式下进入框架根目录执行:
php think make:event <自定义的类名>
例如:
php think make:event userevent
执行之后将在<框架根目录>\app\event\下生成userevent这个类。
再在该类中定义一个handle方法,该方法有一个传入参数。方法名和传入的参数名可以任意定义。具体的业务逻辑就可以放在handle方法里面处理。
接下来,在usersubscribe类里面新增subscribe方法,该方法需要接收一个event对象作为参数。接着,在该函数里将事件监听绑定到userevent类的handle方法上。如下:
$event->listen('testevent', [app('app\event\userevent'), 'handle']);
完整代码如下
other和index类的代码跟第一种途径一样
usersubscribe:事件订阅类
<?phpdeclare (strict_types = 1);namespace app\subscribe;use think\event;class usersubscribe{ public function subscribe(event $event) { $event->listen('testevent', [app('app\event\userevent'), 'handle']); }}
userevent:事件处理类
<?phpdeclare (strict_types = 1);namespace app\event;class userevent{ public function handle($user) { //当调用index类的test1方法时该代码有效,$user为null var_dump($user); //当调用index类的test2方法时该代码有效,$user为字符串hello var_dump($user); //当调用index类的test3方法时该代码有效,$user为index类的实例 //可以访问index类的name变量 echo $user->name; //当调用index类的test4方法时该代码有效,$user为other类的实例 //可以调用other类的hello方法 echo $user->hello(); }}
以上就是thinkphp事件机制如何实现的详细内容。
其它类似信息

推荐信息