首页 » PHP教程 » php事宜道理技巧_PHP详解Laravel模型事宜的事理

php事宜道理技巧_PHP详解Laravel模型事宜的事理

访客 2024-11-27 0

扫一扫用手机浏览

文章目录 [+]

下面话不多说了,来一起看看详细的先容吧。

先来看看如何利用模型事宜,文档里面写了两种方法,实际上统共有三种办法可以定义一个模型事宜,这里以saved事宜来做例子,其他事宜都一样。

php事宜道理技巧_PHP详解Laravel模型事宜的事理

1.events属性

php事宜道理技巧_PHP详解Laravel模型事宜的事理
(图片来自网络侵删)

直接上代码:

class User extends Authenticatable { use Notifiable; protected $events = [ 'saved' => UserSaved::class, ];}

这个比较难以理解,而且文档并没有详细解释,刚开始以为saved被触发后会调用UserSaved里面的handle方法,实际上并不是。
这个数组只是对事宜做的一个映射,它定义了在模型的saved的时候会触发UserSaved这个事宜,我们还要定义该事宜以及其监听器才可以:

namespace App\Events;use App\User;class UserSaved { public $user; public function __construct(User $user){ $this->user = $user; }}

namespace App\Listeners;class UserSavedListener { public function handle(UserSaved $userSaved){ dd($userSaved); }}

然后还要到EventServiceProvider中去注册该事宜和监听器:

class EventServiceProvider extends ServiceProvider{ / The event listener mappings for the application. @var array / protected $listen = [ 'App\Events\UserSaved' => [ 'App\Listeners\UserSavedListener', ] ]; / Register any events for your application. @return void / public function boot() { parent::boot(); }}

这样在saved节点的时候,UserSaved事宜会被触发,其监听器UserSavedListener的handle方法会被调用。

2.不雅观察者

这是文档比较推崇的一个模型事宜定义方法,也比较好理解,先定义一个不雅观察者:

use App\User;class UserObserver{ / 监听用户创建事宜. @param User $user @return void / public function created(User $user) { // } / 监听用户创建/更新事宜. @param User $user @return void / public function saved(User $user) { // }}

然后在某个做事供应者的boot方法中注册不雅观察者:

namespace App\Providers;use App\User;use App\Observers\UserObserver;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ / Bootstrap any application services. @return void / public function boot() { User::observe(UserObserver::class); } / Register the service provider. @return void / public function register() { // }}

这样在模型事宜触发的时候,UserObserver的相应方法就会被调用。
实在,在利用不雅观察者的时候,除了一些系统自带的,我们还可以定义一些自己的事宜:

class User extends Authenticatable { use Notifiable; protected $observables = [ 'customing', 'customed' ];}

然后在不雅观察者里面定义同名方法

class UserObserver{ / 监听用户创建/更新事宜. @param User $user @return void / public function saved(User $user) { // } public function customing(User $user){ } public function customed(User $user){ }}

由于是我们自己定义的事宜,以是触发的时候也必须手动触发,在须要触发的地方调用模型里面的一个fireModelEvent方法即可。
不过由于该方法是protected的,以是只能在自己定义的模型方法里面,当然如果通过反射来调用,或容许以直接在$user工具上触发也说不定,这个我没试,大家可以自行测试下。

class User extends Authenticatable { use Notifiable; protected $observables = [ 'customing', 'awesoming' ]; public function custom(){ if ($this->fireModelEvent('customing') === false) { return false; } //TODO if ($this->fireModelEvent('customed') === false) { return false; } }}

3.静态方法定义

我们还可以通过模型上的对应静态方法来定义一个事宜,在EventServiceProvider的boot方法里面定义:

class EventServiceProvider extends ServiceProvider{ / Register any events for your application. @return void / public function boot() { parent::boot(); User::saved(function(User$user) { }); User::saved('UserSavedListener@saved'); }}

通过静态方法定义的时候,可以直接通报进入一个闭包,也可以定义为某个类的方法,事宜触发时候通报进入的参数便是该模型实例。

点击理解更多去学习:非常利用的代码优化,怎么才能写好代码https://www.toutiao.com/i6731724936789885444/

标签:

相关文章

今日头条算法岗位面试核心方法与必备知识

大数据、人工智能等技术在各行各业得到了广泛应用。今日头条作为中国领先的资讯平台,其算法技术更是备受关注。今日头条算法岗位面试成为了...

PHP教程 2025-01-31 阅读1 评论0

今日头条算法推送如何打造个化阅读体验

在互联网时代,信息爆炸成为常态,用户获取信息的渠道越来越多,而时间却愈发有限。如何让用户在海量信息中快速找到感兴趣的内容,成为了各...

PHP教程 2025-01-31 阅读1 评论0