Как регулировать трансляцию событий в Laravel? - PullRequest
0 голосов
/ 10 января 2020

Я использую некоторые события, которые транслируются с помощью реализации ShouldBroadcast.

Есть ли способ подавления этих событий для правильной трансляции? Я хочу, чтобы из множества созданных событий транслировалось только несколько, в зависимости от того, когда они создаются.

Когда я пытаюсь регулировать скорость в broadcastOn(), это дает исключение, так как я не возвращайте канал, хотя, если я вернусь, он будет транслироваться.

Моя broadcastOn() функция

public function broadcastOn()
    {
        $run = true;

        Redis::throttle(class_basename($this) . 'Broadcast')
            ->allow(config('app.events.throttle.allow'))
            ->every(config('app.events.throttle.every'))
            ->then(
                function () {
                    info(class_basename($this));
                    //                    return new Channel('entries');
                },
                function () use (&$run) {
                    info(class_basename($this) . ' discarded');
                    $run = false;
                }
            );

        return $run ? new Channel('entries') : null;
    }

Когда новый канал не инициализирован, он дает исключение ниже:

local.ERROR: Expected at least one channel
 {"exception":"[object] (Illuminate\Broadcasting\BroadcastException(code: 0): Expected at least one channel
 at /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php:119)
[stacktrace]
#0 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php(48): Illuminate\Broadcasting\Broadcasters\PusherBroadcaster->broadcast(Array, 'App\\Events\\Entr...', Array)
#1 [internal function]: Illuminate\Broadcasting\BroadcastEvent->handle(Object(Illuminate\Broadcasting\Broadcasters\PusherBroadcaster))
#2 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#3 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#4 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#5 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/Container.php(576): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#6 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Container\Container->call(Array)
#7 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Illuminate\Broadcasting\BroadcastEvent))
#8 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Broadcasting\BroadcastEvent))
#9 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#10 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(49): Illuminate\Bus\Dispatcher->dispatchNow(Object(Illuminate\Broadcasting\BroadcastEvent), false)
#11 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(88): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#12 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(331): Illuminate\Queue\Jobs\Job->fire()
#13 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(281): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#14 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(118): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#15 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(102): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#16 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(86): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#17 /Users/brunomasquio/code/docigp/vendor/laravel/horizon/src/Console/WorkCommand.php(46): Illuminate\Queue\Console\WorkCommand->handle()
#18 [internal function]: Laravel\Horizon\Console\WorkCommand->handle()
#19 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#20 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#21 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#22 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Container/Container.php(576): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#23 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Console/Command.php(183): Illuminate\Container\Container->call(Array)
#24 /Users/brunomasquio/code/docigp/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#25 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Console/Command.php(170): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#26 /Users/brunomasquio/code/docigp/vendor/symfony/console/Application.php(921): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#27 /Users/brunomasquio/code/docigp/vendor/symfony/console/Application.php(273): Symfony\Component\Console\Application->doRunCommand(Object(Laravel\Horizon\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#28 /Users/brunomasquio/code/docigp/vendor/symfony/console/Application.php(149): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#29 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Console/Application.php(90): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#30 /Users/brunomasquio/code/docigp/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(133): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#31 /Users/brunomasquio/code/docigp/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 {main}
"}

1 Ответ

0 голосов
/ 11 января 2020

Вы можете использовать условия вещания и поместить свой код регулирования в broadcastWhen().

В противном случае я бы предложил разместить код регулирования там, где вы запускаете события / трансляцию (что может означать «вручную», вместо использования транслируемых событий), однако, как вы указали в комментариях, это не будет работать для вашего варианта использования, но может для других, читающих это обратно.

...