1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace App\Providers;
7
8use App\Libraries\TransactionStateManager;
9use Event;
10use Illuminate\Database\Events\TransactionBeginning;
11use Illuminate\Database\Events\TransactionCommitted;
12use Illuminate\Database\Events\TransactionRolledBack;
13use Illuminate\Support\ServiceProvider;
14
15class TransactionStateServiceProvider extends ServiceProvider
16{
17 /**
18 * Bootstrap the application services.
19 *
20 * @return void
21 */
22 public function boot()
23 {
24 Event::listen(TransactionBeginning::class, function ($event) {
25 resolve(TransactionStateManager::class)->begin($event->connection);
26 });
27
28 Event::listen(TransactionCommitted::class, function ($_event) {
29 resolve(TransactionStateManager::class)->commit();
30 });
31
32 Event::listen(TransactionRolledBack::class, function ($_event) {
33 resolve(TransactionStateManager::class)->rollback();
34 });
35 }
36
37 /**
38 * Register the application services.
39 *
40 * @return void
41 */
42 public function register()
43 {
44 // Connection after commit tracker.
45
46 // Laravel uses a singleton DatabaseManager that reuses connections
47 // by name, so a singleton for tracking should be good enough.
48 // The alternative is to override Connection and its subclasses.
49 $this->app->singleton(TransactionStateManager::class, function ($app) {
50 return new TransactionStateManager();
51 });
52 }
53}