事件机制的实现有两种途径:通过监听、通过订阅 一、通过监听1、创建监听类:在命令行模式下进入框架根目录执行 php think make:listener <自定义的类名>
例如: php think make:listener UserListener
执行之后将在<框架根目录>\app\ listener\下生成 UserListener这个类。 2、配置监听:在<框架根目录>\app\event.php这个文件的listen数组中配置UserListener这个类,如下: 'listen' => [ 'testEvent' => ['app\listener\UserListener'] ],
3、触发监听:在你需要触发监听的地方加入如下代码 注意:这里的参数testEvent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。 触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到UserListener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。 4、处理监听逻辑:在UserListener类的handle方法中完成业务逻辑 完整代码如下 Other:一个用来测试的类 <?php
namespace app\controller;
class Other
{
public function hello()
{
echo 'hello function';
}
} 登录后复制 Index:触发监听的类 <?php
namespace 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:事件监听类 <?php
namespace 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:事件订阅类 <?php
namespace 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:事件订阅类 <?php
declare (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:事件处理类 <?php
declare (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事件机制如何实现的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |