technote/laravel-transaction-fire-event

Controlling events that occur in a transaction

v0.3.3 2021-10-23 11:48 UTC

README

CI Status codecov CodeFactor License: MIT PHP: >=7.4

Read this in other languages: English, 日本語.

Controlling events that occur in a transaction.

Packagist

Table of Contents

Details

Install

composer require technote/laravel-transaction-fire-event

Usage

  1. In the model where you want to control the firing of events, use DelayFireEvent trait.

    <?php
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Technote\TransactionFireEvent\Models\DelayFireEvent;
    
    class Item extends Model
    {
        use DelayFireEvent;
    
        public static function boot()
        {
            parent::boot();
    
            self::saved(function ($model) {
                //
            });
        }
    
        // relation example
        public function tags(): BelongsToMany
        {
            return $this->belongsToMany(Tag::class);
        }
    }
  2. If used within a transaction, saved and deleted events will be held until the end of the transaction.

    DB::transaction(function () {
        $item = new Item();
        $item->name = 'test';
        $item->save();
        // The `saved` event will not be fired here yet.
    
        $item->tags()->sync([1, 2, 3]);
    }
    
    // The `saved` event is called at the end of the transaction,
    // so you can get the synchronized tags with `$model->tags()->sync`.

Change the event to hold fire

The target events are saved and deleted by default.
To change it, override getDelayTargetEvents.

protected function getDelayTargetEvents(): array
{
    return [
        'created',
        'updated',
        'saved',
        'deleted',
    ];
}

Author

GitHub (Technote)
Blog