laravel - 如何限制 Laravel 中的广播事件?
问题描述
我正在使用一些通过ShouldBroadcast
.
有没有办法限制这些事件以正确的方式播出?我想要的是,从创建的一堆事件中,只有少数被广播,具体取决于它们的创建时间。
当我尝试节流时broadcastOn()
,它会给出一个异常,因为我没有返回 Channel,但是,如果我返回,它将被广播。
我的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}
"}
解决方案
您可以使用广播条件并将您的限制代码放在broadcastWhen()
.
否则,我建议将节流代码放置在触发事件/广播的位置(这可能意味着“手动”广播而不是使用可广播事件),但是正如您在评论中指出的那样,这不适用于您的用例,但可能对于其他阅读此内容的人。
推荐阅读
- regex - 捕获包装字符中的空格并删除它们,可能使用 RegEx
- node.js - 当前的服务器发现和监控引擎在 mongoDB、Node.js 中已弃用
- mysql - MySQL左连接返回多行,我想要一行
- php - Laravel 将数据插入数据库
- ios - 尽管“尝试”,为什么 swift 会抛出异常?
- ios - UICollectionViewCell 内容与其他单元格重叠
- mysql - 当从付费私人仓库中删除某人时,他们仍然可以推送代码吗
- r - 如何使用 R 中的 rugarch 包指定通用 GARCH-M 模型
- javascript - 我可以在不使用 deferr 的情况下在变量更改时解决承诺吗?
- javascript - 在画布中移动元素会多次复制它,直到打开开发人员的控制台