如何将Thinkphp的事件机制改写为长尾词?

2026-04-03 03:461阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1344个文字,预计阅读时间需要6分钟。

如何将Thinkphp的事件机制改写为长尾词?

事件机制实现有两种途径:一是通过监听和订阅,二是创建监听类。在命令行模式下,可以通过以下命令创建自定义监听类:

shellphp think make:listener 自定义的类名

例如:创建名为`UserLi`的监听类:

shellphp think make:listener UserLi

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

    一、通过监听

    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、触发监听:在你需要触发监听的地方加入如下代码

    event('testEvent');

    注意:这里的参数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方法里面处理。

    如何将Thinkphp的事件机制改写为长尾词?

    接下来,在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(); } }

    标签:

    本文共计1344个文字,预计阅读时间需要6分钟。

    如何将Thinkphp的事件机制改写为长尾词?

    事件机制实现有两种途径:一是通过监听和订阅,二是创建监听类。在命令行模式下,可以通过以下命令创建自定义监听类:

    shellphp think make:listener 自定义的类名

    例如:创建名为`UserLi`的监听类:

    shellphp think make:listener UserLi

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

      一、通过监听

      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、触发监听:在你需要触发监听的地方加入如下代码

      event('testEvent');

      注意:这里的参数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方法里面处理。

      如何将Thinkphp的事件机制改写为长尾词?

      接下来,在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(); } }

      标签: