当前位置:首页 > CMS教程 > 其它CMS > 列表

详解Laravel模型事件和模型事件在Trait中的使用

发布:smiling 来源: PHP粉丝网  添加日期:2023-06-27 13:12:09 浏览: 评论:0 

这篇文章主要为大家介绍了详解Laravel模型事件和模型事件在Trait中的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪。

模型事件

Laravel 模型事件允许你监听模型生命周期内的事件, 并且通过这个事件去做一些模型通用性的东西, 例如检查用户修改了那个字段, 将字段的什么值修改成另外的什么值, 等等.

事件类型

  1. # 当现有模型被数据库检索时 
  2. retrieved 
  3. # 当一个新的模型被第一次保存时 
  4. creating 
  5. created 
  6. # 对一个已经存在于数据库的模型调用 save 方法 
  7. updating 
  8. updated 
  9. # 当模型数据被删除时 
  10. deleting 
  11. deleted 
  12. # 当创建和更新执行时都会调用 
  13. saving 
  14. saved 
  15. # 当启用软删除的数据被恢复时 
  16. restoring 
  17. restored 
  18. # 当启用软删除的数据被强制删除时 
  19. forceDeleted 
  20. # 复制 
  21. replicating 
  22. # 指定模型的指定事件被触发时(注意 $name 前有个空格) 
  23. # event 对应以上的事件类型 
  24. # name 对应的是模型的类名称 
  25. eloquent.{$event}: {$name} 

以上事件类型的注册可以通过 boot 方法注册

boot 方法和事件注册

模型在执行时候仅仅执行一次的 boot 方法, 可以理解为模型启动时候的注册钩子方法我们看下示例:

  1. <?php 
  2. Class PamAccount extend Model 
  3.     public static function boot() 
  4.     { 
  5.         parent::boot(); 
  6.         self::deleting(function ($user){ 
  7.             if (!method_exists((new static::class), 'bootSoftDeletes')) { 
  8.                 $user->roles()->sync([]); 
  9.             } 
  10.             return true; 
  11.         }); 
  12.     } 

这里注册了一个事件, 这个事件的目的是在删除的时候(如果不是软删除) 删除角色信息, 这里注册的是一个 deleting方法, 使用的方式是 self::deleting($cb) 这个函数, 除此之外其他的事件也都有相对应的方法.

boot 在 traits 中的使用

假如有一个场景我们需要再多个模型中均需要注册同样的操作, 我们是否需要再多个模型中编写重复的代码呢 ? 答案是不需要, 因为 Trait 也提供了相关的方法来进行注册/初始化, 在 Model.php 中可以发现如下定义

  1. protected static function boot() 
  2.     static::bootTraits(); 

这里的意思是在运行 boot 方法的时候同时注册相关 Traits 方法, 这也是 Eloquent ORM 的优势之一, 当使用 Eloquent 时,可以执行 Trait 注册逻辑。

boot 方法非常_神奇_,因为可以将 trait 附加到模型,如果在 trait 上设置一些方法,这些方法将在开始使用模型时调用。它们遵循如下格式 : boot{Trait} 和 initialize{Trait},允许在多个模型中重用相同的代码。

boot(启动) 和 initialize(初始化)

两者的区别很简单:boot静态执行 ,而 initialize动态执行。 boot 影响模型的所有实例,而 initialize 将仅对其实例起作用。

为了更好地举例说明这些是如何工作的,让我们创建一个名为HasToken的 trait. 这个 trait 在给定的 Eloquent 模型上有两个任务。

创建模型时添加事件以记录谁插入了记录

将随机字符串作为标记添加到模型中

第一项任务是了解经过身份验证的用户创建了新模型。第二个将允许模型自动创建一个随机令牌,以避免在我们应用程序的多个位置手动创建它。

我们可以使用单个 trait 来做到这一点:

  1. <?php 
  2. namespace App; 
  3. use Illuminate\Support\Facades\Log; 
  4. use Illuminate\Support\Facades\Auth; 
  5. use Illuminate\Support\Str; 
  6. trait HasToken 
  7.     /** 
  8.      * Boot the trait 
  9.      * 
  10.      * @return void 
  11.      */ 
  12.     protected function bootHasToken() 
  13.     { 
  14.         static::created(function ($model) { 
  15.             // Log who created this model 
  16.             Log::info('Token for ' . class_basename($model) . ' created by ' . Auth::user()->getKey()); 
  17.         }); 
  18.     } 
  19.     /** 
  20.      * Initialize the trait 
  21.      * 
  22.      * @return void 
  23.      */ 
  24.     protected function initializeHasToken() 
  25.     { 
  26.         // Automatically create a random token 
  27.         $this->token = Str::random(100); 
  28.     } 

Boot(启动)

boot 方法将在静态模型上工作。例如,如果将此 trait 添加到 Authentication 模型中,则使用此方法所做的一切都会以静态的方式影响该模型 > 方法名称必须遵循该boot{TraitName}格式

这对于向 eloquent 事件添加回调非常方便,例如creating或retrieving,因为这些事件是静态的。

  1. /** 
  2.  * Boot the trait 
  3.  *  
  4.  * @return void 
  5.  */ 
  6. protected function bootHasToken() 
  7.     static::created(function ($model) { 
  8.         // Log who created this model 
  9.         Log::info('Token for ' .  
  10.             class_basename($model) .  
  11.            ' created by ' .  
  12.            Auth::user()->getKey() 
  13.         ); 
  14.     }); 

这是一个非常棒的想法:启动模型不会执行两次,仅在需要时进行。无需担心 bootHasToken() 多次调用该方法,Eloquent ORM 模型会持续跟踪启动的模型

Initialize (初始化)

我们可以使用 boot 方法做静态级的事情,但是要操作模型实例本身,我们需要使用初始化方法,可以使用该initialize{Trait}格式创建初始化程序。

  1. /** 
  2.  * Initialize the trait 
  3.  * 
  4.  * @return void 
  5.  */ 
  6. protected function initializeHasToken() 
  7.     // Automatically create a random token 
  8.     $this->token = Str::random(100); 

每次实例化新模型时都会运行初始化方法. And that’s the magic. Happy coding.

参考 Laravel: Booting and Initializing Models with traits

Tags: Laravel模型事件 Trait

分享到: