如何限制Laravel中的广播事件?

问题描述 投票:0回答:1

我正在使用通过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}
"}

laravel laravel-5 events broadcast pusher
1个回答
0
投票

您可以使用broadcast conditions并将限制代码放置在broadcastWhen()中。

否则,我建议将限制代码放在触发事件/广播的位置(这可能意味着“手动”广播而不是使用可广播的事件),但是正如您在注释中指出的那样,它不适用于您的用例但可能会让其他人读回去。

© www.soinside.com 2019 - 2024. All rights reserved.