laravel 模型事件-使用

本文详细介绍了在Laravel框架中如何使用模型事件,包括基础事件如创建、更新等的操作,以及如何实现模型观察者来更优雅地处理事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型事件

基础事件
  • User 模型加入代码

    • protected $dispatchesEvents = [
          'saving' => \App\Events\UserSaving::class,
      ];
      
  • 创建事件

    • // artisan make:event UserSaving
      
      <?php
      
      namespace App\Events;
      
      use App\User;
      use Illuminate\Queue\SerializesModels;
      
      class UserSaving
      {
          use SerializesModels;
      
          public $user;
      
          /**
           *  创建一个新的事件实例
           *
           * @param \App\User $user
           */
          public function __construct(User $user)
          {
              $this->user = $user;
          }
          
          /**
           * 处理事件。
           *
           * @param  \App\Events\UserSaving $event
           * @return mixed
           */
          public function handle(UserSaving $event)
          {
              if (stripos($event->user->name, 'paul') !== false) {
                  return false;
              }
          }
      }
      
      // Model::save()
      public function save(array $options = [])
      {
          $query = $this->newQueryWithoutScopes();
      
          // 如果 "saving" 事件返回 false ,我们将退出保存并返回
          // false,表示保存失败。这为服务监听者提供了一个机会,
          // 当验证失败或者出现其它任何情况,都可以取消保存操作。
          if ($this->fireModelEvent('saving') === false) {
              return false;
          }
      }
      
  • 创建监听器

    • // php artisan make:listener UserSaving
      
      <?php
      
      namespace App\Listeners;
      
      use App\Events\UserSaving as UserSavingEvent;
      
      class UserSaving
      {
          /**
           * 处理事件。
           *
           * @param  \App\Events\UserSavingEvent $event
           * @return mixed
           */
          public function handle(UserSavingEvent $event)
          {
              app('log')->info($event->user);
          }
      }
      
  • 注册监听器

    • // EventServiceProvider::$listen
      
      <?php
      
      namespace App\Providers;
      
      use Illuminate\Support\Facades\Event;
      use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
      
      class EventServiceProvider extends ServiceProvider
      {
          /**
           * 应用的事件监听器。
           * 
           * @var array
           */
          protected $listen = [
              \App\Events\UserSaving::class => [
                  \App\Listeners\UserSaving::class,
              ],
          ];
      
          // ...
      }
      
模型观察者
  • 创建类

    • <?php
      
      namespace App\Observers;
      
      use App\User;
      
      class UserObserver
      {
          /**
           * 监听 User 创建事件。
           *
           * @param  \App\User  $user
           * @return void
           */
          public function created(User $user)
          {
              //
          }
      
          /**
           * 监听 User 删除事件。
           *
           * @param  \App\User  $user
           * @return void
           */
          public function deleting(User $user)
          {
              //
          }
      }
      
  • 注册观察者

    • // 在服务提供者 AppServiceProvider 中的 boot() 方法里注册观察者。
      
      /**
       * 运行所有应用服务。
       *
       * @return void
       */
      public function boot()
      {
          User::observe(UserObserver::class);
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值