mpyw / laravel-transaction-observer
Observe delayed events and fire them after ALL transactions are done.
Installs: 3 414
Dependents: 0
Suggesters: 0
Security: 0
Stars: 9
Watchers: 2
Forks: 1
pkg:composer/mpyw/laravel-transaction-observer
This package has no released version yet, and little information is available.
README
Observe delayed events and fire them after ALL transactions are done.
Requirements
- PHP: ^5.5 || ^7.0
- Laravel: ^5.4
Installing
composer require mpyw/laravel-transaction-observer:^1.0
Basic Usage
Register service provider.
config/app.php
:
/* * Package Service Providers... */ mpyw\LaravelTransactionObserver\Provider::class,
That's all. Now you can dispatch DelayedCall
that takes callback as the first argument.
public mpyw\LaravelTransactionObserver\Events\DelayedCall::__construct(callable $callback) public void mpyw\LaravelTransactionObserver\Events\DelayedCall::fire()
Note that the callback is:
- Fired when ALL transactions are done.
- Canceled if current transaction failed.
/** * Example: Handling callbacks for counter caching */ use mpyw\LaravelTransactionObserver\Events\DelayedCall; DB::transaction(function () { $post = Post::create([ 'text' => 'This is main text', 'comment_count' => 0, ]); DB::transaction(function () use ($post) { $comment = new Comment(['text' => 'This is first comment']); $comment->post()->associate($post); $comment->save(); event(new DelayedCall(function () use ($post) { ++$post->comment_count; // A: Increment counter cache! })); }); DB::transaction(function () use ($post) { $comment = new Comment(['text' => 'This is second comment']); $comment->post()->associate($post); $comment->save(); event(new DelayedCall(function () use ($post) { ++$post->comment_count; // B: Increment counter cache! })); throw new \RuntimeException('Oops!'); }); }); // A fires here, while B never do.
Advanced Usage: Prepare custom Event classes
1. Make your class that implements DelayedEvent
.
app/Events/MyDelayedEvent.php
:
<?php namespace App\Events; use mpyw\LaravelTransactionObserver\Contracts\DelayedEvent; class MyDelayedEvent implements DelayedEvent { protected $payload; public function __construct($payload) { $this->payload = $payload; } public function fire() { ($this->payload)(); } }
2. Listen it in your application service provider.
app/Providers/AppServiceProvider.php
:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use mpyw\LaravelTransactionObserver\Facades\TransactionObserver; use App\Events\MyDelayedEvent; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { TransactionObserver::listen(MyDelayedEvent::class); } }
Related Packages
- mpyw/laravel-delayed-counter-cache: Delayed counter cache incremented/decremented out of transactions