Rumah rangka kerja php ThinkPHP ThinkPHP6.0:事件系统以及查询事件、模型事件的使用

ThinkPHP6.0:事件系统以及查询事件、模型事件的使用

Dec 16, 2019 pm 02:19 PM
sistem acara acara model

ThinkPHP6.0:事件系统以及查询事件、模型事件的使用

在最新的6.0版本中引入了新的事件系统用以替代5.1版本的行为,同时也接管了数据库事件和模型事件。

本篇主要描述下新版的事件系统以及查询事件、模型事件的使用。

定义事件

事件系统的所有操作都通过think\facade\Event类进行静态调用

事件系统使用了观察者模式,提供了解耦应用的更好方式。在你需要监听事件的位置,添加如下代码:

Event::trigger('UserLogin');
Salin selepas log masuk

或者使用助手函数

event('UserLogin');
Salin selepas log masuk

这里UserLogin表示一个事件标识,如果你定义了单独的事件类,你可以使用事件类名,甚至可以传入一个事件类实例。

event('app\event\UserLogin');
Salin selepas log masuk

事件类可以通过命令行快速生成

php think make:event UserLogin
Salin selepas log masuk

默认会生成一个app\event\UserLogin事件类,也可以指定完整类名生成。

我们可以给事件类添加方法

namespace app\event;
use app\model\User;
class UserLogin
{
    public $user;
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}
Salin selepas log masuk

一般事件类无需继承任何其它类。

你可以给事件类绑定一个事件标识

Event::bind('UserLogin', 'app\event\UserLogin');
Salin selepas log masuk

或者在应用的event.php事件定义文件中批量绑定。

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
];
Salin selepas log masuk

如果你没有定义事件类的话,则无需绑定。

ThinkPHP的事件系统不依赖事件类,如果没有额外的需求,仅通过事件标识也可以使用。

你可以在event方法中传入一个事件参数

event('UserLogin', $user);
Salin selepas log masuk

事件监听

你可以手动注册一个事件监听

Event::listen('UserLogin', function($user) {
    // 
});
Salin selepas log masuk

或者使用监听类

Event::listen('UserLogin', 'app\listener\UserLogin');
Salin selepas log masuk

可以通过命令行快速生成一个事件监听类

php think make:listener UserLogin
Salin selepas log masuk

默认会生成一个app\listener\UserLogin事件监听类,也可以指定完整类名生成。

事件监听类只需要定义一个handler方法,支持依赖注入。

<?php
namespace app\listener;
class UserLogin
{
    public function handle($user)
    {
        // 事件监听处理
    }   
}
Salin selepas log masuk

在handler方法中如果返回了false,则表示监听中止,将不再执行该事件后面的监听。

一般建议直接在事件定义文件中定义对应事件的监听。

return [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
];
Salin selepas log masuk

事件订阅

可以通过事件订阅机制,在一个监听器中监听多个事件,例如通过命令行生成一个事件订阅者类,

php think make:subscribe User
Salin selepas log masuk

默认会生成app\subscribe\User类,或者你可以指定完整类名生成。

然后你可以在事件订阅类中添加不同事件的监听方法,例如:

<?php
namespace app\subscribe;
class User
{
    public function onUserLogin($user)
    {
        // 事件响应处理
    }
    public function onUserLogout($user)
    {
        // 事件响应处理
    }
}
Salin selepas log masuk

监听事件的方法命名规范是on+事件标识(驼峰命名),然后注册该事件订阅

Event::subscribe(&#39;app\subscribe\User&#39;);
Salin selepas log masuk

一般建议直接在事件定义文件中定义

return [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
    &#39;subscribe&#39;    =>    [
       &#39;\app\subscribe\User&#39;,
        // 更多事件订阅
    ],
];
Salin selepas log masuk

内置事件

内置的系统事件包括:

1576476349917050.png

AppInit事件定义必须在全局事件定义文件中定义,其它事件支持在应用的事件定义文件中定义。

原来5.1的一些行为标签已经废弃,所有取消的标签都可以使用中间件更好的替代。可以把中间件看成处理请求以及响应输出相关的特殊事件。事实上,中间件的handle方法只是具有特殊的参数以及返回值而已。

查询事件

数据库操作的回调也称为查询事件,是针对数据库的CURD操作而设计的回调方法,主要包括:

1576476293220136.png

使用下面的方法注册数据库查询事件

\think\facade\Db::event(&#39;before_select&#39;, function ($query) {
    // 事件处理
    return $result;
});
Salin selepas log masuk

同一个查询事件可以注册多个响应执行。查询事件在新版里面也已经被事件系统接管了,因此如果你注册了一个before_select查询事件监听,底层其实是向标识为db.before_select的事件注册了一个监听。

查询事件的方法参数只有一个:当前的查询对象。但你可以通过依赖注入的方式添加额外的参数。

模型事件

模型事件是指在进行模型的查询和写入操作的时候触发的操作行为。

模型事件只在调用模型的方法生效,使用查询构造器操作是无效的。

模型支持如下事件:

1576476181857690.png

注册的回调方法支持传入一个参数(当前的模型对象实例),但支持依赖注入的方式增加额外参数。

如果before_write、before_insert、 before_update 、before_delete事件方法中返回false或者抛出think\exception\

ModelEventException异常的话,则不会继续执行后续的操作。

模型事件定义

最简单的方式是在模型类里面定义静态方法来定义模型的相关事件响应。

<?php
namespace app\index\model;
use think\Model;
use app\index\model\Profile;
class User extends Model
{
    public static function onBeforeUpdate($user)
    {
    if (&#39;thinkphp&#39; == $user->name) {
        return false;
        }
    }
    
    public static function onAfterDelete($user)
    {
Profile::destroy($user->id);
    }
}
Salin selepas log masuk

参数是当前的模型对象实例,支持使用依赖注入传入更多的参数。

模型事件观察者

如果希望模型的事件单独管理,可以给模型注册一个事件观察者,例如:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    protected $observerClass = &#39;app\index\observer\User&#39;;
}
Salin selepas log masuk

User观察者类定义如下:

<?php
namespace app\index\observer;
use app\index\model\Profile;
class User
{
    public function onBeforeUpdate($user)
    {
    if (&#39;thinkphp&#39; == $user->name) {
        return false;
        }
    }
    
    public function onAfterDelete($user)
    {
Profile::destroy($user->id);
    }
}
Salin selepas log masuk

观察者类的事件响应方法的第一个参数就是模型对象实例,你依然可以通过依赖注入传入其它的对象参数。

PHP中文网,大量的免费ThinkPHP入门教程,欢迎在线学习!

本文转自:https://blog.thinkphp.cn/1037387

Atas ialah kandungan terperinci ThinkPHP6.0:事件系统以及查询事件、模型事件的使用. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah pertimbangan utama untuk menggunakan ThinkPhp dalam seni bina tanpa pelayan? Apakah pertimbangan utama untuk menggunakan ThinkPhp dalam seni bina tanpa pelayan? Mar 18, 2025 pm 04:54 PM

Artikel ini membincangkan pertimbangan utama untuk menggunakan ThinkPhp dalam arkitek tanpa pelayan, memberi tumpuan kepada pengoptimuman prestasi, reka bentuk tanpa statik, dan keselamatan. Ia menyoroti faedah seperti kecekapan kos dan skalabiliti, tetapi juga menangani cabaran

Apakah ciri -ciri canggih bekas suntikan ketergantungan ThinkPhp? Apakah ciri -ciri canggih bekas suntikan ketergantungan ThinkPhp? Mar 18, 2025 pm 04:50 PM

ThinkPhp's Container IOC menawarkan ciri -ciri canggih seperti pemuatan malas, mengikat kontekstual, dan suntikan kaedah untuk pengurusan ketergantungan yang cekap di php apps.Character Count: 159

Bagaimanakah saya dapat mengelakkan kelemahan suntikan SQL dalam ThinkPhp? Bagaimanakah saya dapat mengelakkan kelemahan suntikan SQL dalam ThinkPhp? Mar 14, 2025 pm 01:18 PM

Artikel ini membincangkan menghalang kelemahan suntikan SQL dalam ThinkPHP melalui pertanyaan parameter, mengelakkan SQL mentah, menggunakan ORM, kemas kini tetap, dan pengendalian ralat yang betul. Ia juga meliputi amalan terbaik untuk mendapatkan pertanyaan pangkalan data dan validat

Apakah ciri-ciri utama rangka kerja ujian ThinkPHP? Apakah ciri-ciri utama rangka kerja ujian ThinkPHP? Mar 18, 2025 pm 05:01 PM

Artikel ini membincangkan rangka kerja ujian ThinkPHP, yang menonjolkan ciri-ciri utamanya seperti ujian unit dan integrasi, dan bagaimana ia meningkatkan kebolehpercayaan aplikasi melalui pengesanan bug awal dan kualiti kod yang lebih baik.

Bagaimana untuk membina sistem giliran tugas yang diedarkan dengan ThinkPhp dan RabbitMQ? Bagaimana untuk membina sistem giliran tugas yang diedarkan dengan ThinkPhp dan RabbitMQ? Mar 18, 2025 pm 04:45 PM

Artikel ini menggariskan membina sistem giliran tugas yang diedarkan menggunakan ThinkPhp dan RabbitMQ, yang memberi tumpuan kepada pemasangan, konfigurasi, pengurusan tugas, dan skalabilitas. Isu -isu utama termasuk memastikan ketersediaan yang tinggi, mengelakkan perangkap biasa seperti implope

Apakah perbezaan utama antara ThinkPhp 5 dan ThinkPhp 6, dan kapan hendak menggunakan masing -masing? Apakah perbezaan utama antara ThinkPhp 5 dan ThinkPhp 6, dan kapan hendak menggunakan masing -masing? Mar 14, 2025 pm 01:30 PM

Artikel ini membincangkan perbezaan utama antara ThinkPhp 5 dan 6, yang memberi tumpuan kepada seni bina, ciri, prestasi, dan kesesuaian untuk peningkatan warisan. ThinkPhp 5 disyorkan untuk projek tradisional dan sistem warisan, sementara ThinkPhp 6 sesuai dengan PR baru

Bagaimana untuk melaksanakan penemuan perkhidmatan dan mengimbangi beban dalam microservices ThinkPHP? Bagaimana untuk melaksanakan penemuan perkhidmatan dan mengimbangi beban dalam microservices ThinkPHP? Mar 18, 2025 pm 04:51 PM

Artikel ini membincangkan pelaksanaan penemuan perkhidmatan dan mengimbangi beban dalam microservices ThinkPHP, memberi tumpuan kepada persediaan, amalan terbaik, kaedah integrasi, dan alat yang disyorkan. [159 aksara]

Apakah cara terbaik untuk mengendalikan muat naik fail dan penyimpanan awan di ThinkPhp? Apakah cara terbaik untuk mengendalikan muat naik fail dan penyimpanan awan di ThinkPhp? Mar 17, 2025 pm 02:28 PM

Artikel ini membincangkan amalan terbaik untuk mengendalikan muat naik fail dan mengintegrasikan penyimpanan awan di ThinkPhp, yang memberi tumpuan kepada keselamatan, kecekapan, dan skalabiliti.

See all articles