diff --git a/src/Illuminate/Broadcasting/BroadcastManager.php b/src/Illuminate/Broadcasting/BroadcastManager.php index a384d60b31f4..90f6823469ac 100644 --- a/src/Illuminate/Broadcasting/BroadcastManager.php +++ b/src/Illuminate/Broadcasting/BroadcastManager.php @@ -10,10 +10,12 @@ use Illuminate\Broadcasting\Broadcasters\NullBroadcaster; use Illuminate\Broadcasting\Broadcasters\PusherBroadcaster; use Illuminate\Broadcasting\Broadcasters\RedisBroadcaster; +use Illuminate\Bus\UniqueLock; use Illuminate\Contracts\Broadcasting\Factory as FactoryContract; use Illuminate\Contracts\Broadcasting\ShouldBeUnique; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Contracts\Bus\Dispatcher as BusDispatcherContract; +use Illuminate\Contracts\Cache\Repository as Cache; use Illuminate\Contracts\Foundation\CachesRoutes; use InvalidArgumentException; use Psr\Log\LoggerInterface; @@ -166,12 +168,32 @@ public function queue($event) $queue = $event->queue; } - $this->app->make('queue')->connection($event->connection ?? null)->pushOn( - $queue, - $event instanceof ShouldBeUnique - ? new UniqueBroadcastEvent(clone $event) - : new BroadcastEvent(clone $event) - ); + if ($this->mustBeUniqueAndCannotAcquireLock($event)) { + return; + } + + $this->app->make('queue') + ->connection($event->connection ?? null) + ->pushOn($queue, new BroadcastEvent(clone $event)); + } + + /** + * Determine if the broadcastable event must be unique and determine if we can acquire the necessary lock. + * + * @param mixed $event + * @return bool + */ + protected function mustBeUniqueAndCannotAcquireLock($event) + { + if (! $event instanceof ShouldBeUnique) { + return false; + } + + return ! (new UniqueLock( + method_exists($event, 'uniqueVia') + ? $event->uniqueVia() + : $this->app->make(Cache::class) + ))->acquire($event); } /** diff --git a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php b/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php deleted file mode 100644 index fadb892dcb4e..000000000000 --- a/src/Illuminate/Broadcasting/UniqueBroadcastEvent.php +++ /dev/null @@ -1,60 +0,0 @@ -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); - } -} diff --git a/tests/Integration/Broadcasting/BroadcastManagerTest.php b/tests/Integration/Broadcasting/BroadcastManagerTest.php index 3920b81e4763..30297ebe6114 100644 --- a/tests/Integration/Broadcasting/BroadcastManagerTest.php +++ b/tests/Integration/Broadcasting/BroadcastManagerTest.php @@ -3,7 +3,6 @@ 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; @@ -44,11 +43,11 @@ public function testUniqueEventsCanBeBroadcast() Broadcast::queue(new TestEventUnique); - Bus::assertNotDispatched(UniqueBroadcastEvent::class); - Queue::assertPushed(UniqueBroadcastEvent::class); + Bus::assertNotDispatched(BroadcastEvent::class); + Queue::assertPushed(BroadcastEvent::class); - $lockKey = 'laravel_unique_job:'.UniqueBroadcastEvent::class.TestEventUnique::class; - $this->assertTrue($this->app->get(Cache::class)->lock($lockKey, 10)->get()); + $lockKey = 'laravel_unique_job:'.TestEventUnique::class; + $this->assertFalse($this->app->get(Cache::class)->lock($lockKey, 10)->get()); } }