From 88524f2d5d6b5073a863bbdd54bb54dfba480968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20der=20Tang?= Date: Wed, 17 Aug 2022 08:54:39 +0000 Subject: [PATCH 1/6] Added back unique broadcast event class and keeping class name as prefix for unique id --- .../Broadcasting/UniqueBroadcastEvent.php | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/Illuminate/Broadcasting/UniqueBroadcastEvent.php diff --git a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php new file mode 100644 index 000000000000..08b488963cdb --- /dev/null +++ b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php @@ -0,0 +1,60 @@ +uniqueId = get_class($event); + + if (method_exists($event, 'uniqueId')) { + $this->uniqueId .= $event->uniqueId(); + } elseif (property_exists($event, 'uniqueId')) { + $this->uniqueId .= $event->uniqueId; + } + + if (method_exists($event, 'uniqueFor')) { + $this->uniqueFor = $event->uniqueFor(); + } elseif (property_exists($event, 'uniqueFor')) { + $this->uniqueFor = $event->uniqueFor; + } + + if (method_exists($event, 'uniqueVia')) { + $this->uniqueVia = $event->uniqueVia(); + } elseif (property_exists($event, 'uniqueVia')) { + $this->uniqueVia = $event->uniqueVia; + } + + parent::__construct($event); + } +} From 94f1f91cd658cb5baa4058c84d6e5bc65343d73b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20der=20Tang?= Date: Wed, 17 Aug 2022 08:56:09 +0000 Subject: [PATCH 2/6] Wrapping event in Unique event, which contains data for lock release --- src/Illuminate/Broadcasting/BroadcastManager.php | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Illuminate/Broadcasting/BroadcastManager.php b/src/Illuminate/Broadcasting/BroadcastManager.php index 90f6823469ac..fe9875e74b10 100644 --- a/src/Illuminate/Broadcasting/BroadcastManager.php +++ b/src/Illuminate/Broadcasting/BroadcastManager.php @@ -168,13 +168,15 @@ public function queue($event) $queue = $event->queue; } - if ($this->mustBeUniqueAndCannotAcquireLock($event)) { - return; + $broadcastEvent = new BroadcastEvent(clone $event); + if($event instanceof ShouldBeUnique) { + $broadcastEvent = new UniqueBroadcastEvent(clone $event); + if ($this->mustBeUniqueAndCannotAcquireLock($broadcastEvent)) { + return; + } } - $this->app->make('queue') - ->connection($event->connection ?? null) - ->pushOn($queue, new BroadcastEvent(clone $event)); + $this->app->make('queue')->connection($event->connection ?? null)->pushOn($queue, $broadcastEvent); } /** @@ -185,10 +187,6 @@ public function queue($event) */ protected function mustBeUniqueAndCannotAcquireLock($event) { - if (! $event instanceof ShouldBeUnique) { - return false; - } - return ! (new UniqueLock( method_exists($event, 'uniqueVia') ? $event->uniqueVia() From 89b90f13adc50bcf1bc316d731a6bef42e3a04b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20der=20Tang?= Date: Wed, 17 Aug 2022 08:57:24 +0000 Subject: [PATCH 3/6] Changed integration test to check for unique event --- tests/Integration/Broadcasting/BroadcastManagerTest.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Integration/Broadcasting/BroadcastManagerTest.php b/tests/Integration/Broadcasting/BroadcastManagerTest.php index 30297ebe6114..8ab47fb6554e 100644 --- a/tests/Integration/Broadcasting/BroadcastManagerTest.php +++ b/tests/Integration/Broadcasting/BroadcastManagerTest.php @@ -3,6 +3,7 @@ namespace Illuminate\Tests\Integration\Broadcasting; use Illuminate\Broadcasting\BroadcastEvent; +use Illuminate\Broadcasting\UniqueBroadcastEvent; use Illuminate\Contracts\Broadcasting\ShouldBeUnique; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; @@ -43,10 +44,10 @@ public function testUniqueEventsCanBeBroadcast() Broadcast::queue(new TestEventUnique); - Bus::assertNotDispatched(BroadcastEvent::class); - Queue::assertPushed(BroadcastEvent::class); + Bus::assertNotDispatched(UniqueBroadcastEvent::class); + Queue::assertPushed(UniqueBroadcastEvent::class); - $lockKey = 'laravel_unique_job:'.TestEventUnique::class; + $lockKey = 'laravel_unique_job:'.UniqueBroadcastEvent::class.TestEventUnique::class; $this->assertFalse($this->app->get(Cache::class)->lock($lockKey, 10)->get()); } } From 02bfd651645e1edb6ba908e47012306c6c207a44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20der=20Tang?= Date: Wed, 17 Aug 2022 09:10:48 +0000 Subject: [PATCH 4/6] Fix code style --- src/Illuminate/Broadcasting/BroadcastManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Broadcasting/BroadcastManager.php b/src/Illuminate/Broadcasting/BroadcastManager.php index fe9875e74b10..777ff2384106 100644 --- a/src/Illuminate/Broadcasting/BroadcastManager.php +++ b/src/Illuminate/Broadcasting/BroadcastManager.php @@ -169,7 +169,7 @@ public function queue($event) } $broadcastEvent = new BroadcastEvent(clone $event); - if($event instanceof ShouldBeUnique) { + if ($event instanceof ShouldBeUnique) { $broadcastEvent = new UniqueBroadcastEvent(clone $event); if ($this->mustBeUniqueAndCannotAcquireLock($broadcastEvent)) { return; From f09538c8dd33cba8ba33d5b3771648c882ba8172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20der=20Tang?= Date: Wed, 17 Aug 2022 13:13:26 +0000 Subject: [PATCH 5/6] Respect uniqueVia set or fallback --- .../Broadcasting/UniqueBroadcastEvent.php | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php index 08b488963cdb..2d6508f02ee9 100644 --- a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php +++ b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php @@ -2,6 +2,7 @@ namespace Illuminate\Broadcasting; +use Illuminate\Contracts\Cache\Repository; use Illuminate\Contracts\Queue\ShouldBeUnique; class UniqueBroadcastEvent extends BroadcastEvent implements ShouldBeUnique @@ -20,13 +21,6 @@ class UniqueBroadcastEvent extends BroadcastEvent implements ShouldBeUnique */ public $uniqueFor; - /** - * The cache repository implementation that should be used to obtain unique locks. - * - * @var \Illuminate\Contracts\Cache\Repository - */ - public $uniqueVia; - /** * Create a new job handler instance. * @@ -49,12 +43,15 @@ public function __construct($event) $this->uniqueFor = $event->uniqueFor; } - if (method_exists($event, 'uniqueVia')) { - $this->uniqueVia = $event->uniqueVia(); - } elseif (property_exists($event, 'uniqueVia')) { - $this->uniqueVia = $event->uniqueVia; + parent::__construct($event); + } + + public function uniqueVia() + { + if (method_exists($this->event, 'uniqueVia')) { + return $this->event->uniqueVia(); } - parent::__construct($event); + return app(Repository::class); } } From 0cde5e6095b941cb89a5ddadd8cfda29a6f81c62 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 18 Aug 2022 08:57:14 -0500 Subject: [PATCH 6/6] formatting --- src/Illuminate/Broadcasting/BroadcastManager.php | 6 +++++- .../Broadcasting/UniqueBroadcastEvent.php | 16 ++++++++++------ src/Illuminate/Broadcasting/composer.json | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Broadcasting/BroadcastManager.php b/src/Illuminate/Broadcasting/BroadcastManager.php index 777ff2384106..616f99c6dc56 100644 --- a/src/Illuminate/Broadcasting/BroadcastManager.php +++ b/src/Illuminate/Broadcasting/BroadcastManager.php @@ -169,14 +169,18 @@ public function queue($event) } $broadcastEvent = new BroadcastEvent(clone $event); + if ($event instanceof ShouldBeUnique) { $broadcastEvent = new UniqueBroadcastEvent(clone $event); + if ($this->mustBeUniqueAndCannotAcquireLock($broadcastEvent)) { return; } } - $this->app->make('queue')->connection($event->connection ?? null)->pushOn($queue, $broadcastEvent); + $this->app->make('queue') + ->connection($event->connection ?? null) + ->pushOn($queue, $broadcastEvent); } /** diff --git a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php index 2d6508f02ee9..83c752df08fb 100644 --- a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php +++ b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php @@ -2,6 +2,7 @@ namespace Illuminate\Broadcasting; +use Illuminate\Container\Container; use Illuminate\Contracts\Cache\Repository; use Illuminate\Contracts\Queue\ShouldBeUnique; @@ -22,7 +23,7 @@ class UniqueBroadcastEvent extends BroadcastEvent implements ShouldBeUnique public $uniqueFor; /** - * Create a new job handler instance. + * Create a new event instance. * * @param mixed $event * @return void @@ -46,12 +47,15 @@ public function __construct($event) parent::__construct($event); } + /** + * Resolve the cache implementation that should manage the event's uniqueness. + * + * @return \Illuminate\Contracts\Cache\Repository + */ public function uniqueVia() { - if (method_exists($this->event, 'uniqueVia')) { - return $this->event->uniqueVia(); - } - - return app(Repository::class); + return method_exists($this->event, 'uniqueVia') + ? $this->event->uniqueVia() + : Container::getInstance()->make(Repository::class); } } diff --git a/src/Illuminate/Broadcasting/composer.json b/src/Illuminate/Broadcasting/composer.json index f0736a37dacb..1f38b07af8d3 100644 --- a/src/Illuminate/Broadcasting/composer.json +++ b/src/Illuminate/Broadcasting/composer.json @@ -19,6 +19,7 @@ "psr/log": "^1.0|^2.0|^3.0", "illuminate/bus": "^9.0", "illuminate/collections": "^9.0", + "illuminate/container": "^9.0", "illuminate/contracts": "^9.0", "illuminate/queue": "^9.0", "illuminate/support": "^9.0"