Thinkphp事件机制如何实现

来源:undefined 2024-12-29 01:21:21 0

事件机制的实现有两种途径:通过监听、通过订阅

一、通过监听

1、创建监听类:在命令行模式下进入框架根目录执行

php think make:listener

例如:

php think make:listener UserListener

执行之后将在pplistener下生成UserListener这个类。

立即学习PHP免费学习笔记(深入)”;

listen    => [

    testEvent => [applistenerUserListener]

],

3、触发监听:在你需要触发监听的地方加入如下代码

1

event(testEvent);

登录后复制

注意:这里的参数testEvent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。

触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到UserListener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。

4、处理监听逻辑:在UserListener类的handle方法中完成业务逻辑

完整代码如下

Other:一个用来测试的类

1

2

3

4

5

6

7

8

<?php namespace appcontroller;

class Other

{

public function hello()

{

echo &#39;hello function&#39;;

}

}

登录后复制

Index:触发监听的类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?php namespace appcontroller;

use appBaseController;

class Index extends BaseController

{

public $name  = &#39;index&#39;;

public function test1()

{

//触发监听事件,无参数

event(&#39;testEvent&#39;);

}

public function test2()

{

//触发监听事件,传递字符串

event(&#39;testEvent&#39;, &#39;hello&#39;);

}

public function test3()

{

//触发监听事件,传递自身类

event(&#39;testEvent&#39;, $this);

}

public function test4()

{

//触发监听事件,传递其他类

$other  = new Other();

event(&#39;testEvent&#39;, $other);

}

}

登录后复制

UserListener:事件监听类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php namespace applistener;

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-&gt;hello();

}

}

登录后复制

二、通过订阅

1、创建订阅类

在命令行模式下进入框架根目录执行

php think make:subscribe

例如:

php think make:subscribe UserSubscribe

执行之后将在ppsubscribe下生成UserSubscribe这个类。

2、配置监听

在ppevent.php这个文件的subscribe数组中配置UserSubscribe这个类,如下:

subscribe => [appsubscribeUserSubscribe],

注意:为了测试效果,要把上面配置的UserListener从listen数组删除掉

3、触发监听

跟第一种途径一样

4、处理监听逻辑

处理监听的逻辑又有两种方法,我称之为自动绑定和手动绑定。手动绑定和自动绑定是互斥的,只能二选一。

4.1 自动绑定

完成业务逻辑的ontestEvent方法应该被添加到UserSubscribe类中。添加的方法名不能随意定义,规则是事件名称前面加上on。因为我们在event.php里定义的事件名称是testEvent,所以方法名就是ontestEvent(注意大小写)。监听方法定义之后就自动与事件绑定,所以我称之为自动绑定。

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?php namespace appsubscribe;

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-&gt;hello();

}

}

登录后复制
4.2 手动绑定

首先,创建事件类,负责处理具体的业务逻辑。在命令行模式下进入框架根目录执行:

php think make:event

例如:

php think make:event UserEvent

执行之后将在ppevent下生成UserEvent这个类。

再在该类中定义一个handle方法,该方法有一个传入参数。方法名和传入的参数名可以任意定义。具体的业务逻辑就可以放在handle方法里面处理。

接下来,在UserSubscribe类里面新增subscribe方法,该方法需要接收一个Event对象作为参数。接着,在该函数里将事件监听绑定到UserEvent类的handle方法上。如下:

1

$event-&gt;listen(testEvent, [app(appeventUserEvent), handle]);

登录后复制

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

1

2

3

4

5

6

7

8

9

10

<?php declare (strict_types = 1);

namespace appsubscribe;

use thinkEvent;

class UserSubscribe

{

public function subscribe(Event $event)

{

$event->listen(testEvent, [app(appeventUserEvent), handle]);

}

}

登录后复制

UserEvent:事件处理类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?php declare (strict_types = 1);

namespace appevent;

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-&gt;hello();

}

}

登录后复制

以上就是Thinkphp事件机制如何实现的详细内容,更多请关注php中文网其它相关文章!

最新文章