如何广播由工作类调用的事件

时间:2018-01-24 12:21:17

标签: laravel events jobs broadcast

在Laravel项目中,我试图通过推送器播放名为“已关闭”的事件。

在我的控制器中,我打电话:

<script type="text/javascript">
 var strValue = "@Model.YourObject"; //You set value here from your Model to any JavaScript object.
</script>

我的App \ Jobs \ Closing.php:

App\Jobs\Closing::dispatch();

我的app \ Jobs \ Close.php:

<?php
namespace App\Jobs;
use App\Jobs\Close;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class Closing implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public function __construct(){}
    public function handle()
    {
        $delay = mt_random(10,20);
        Close::dispatch()->delay(now()->addSeconds($delay));
    }
}

我的应用\活动\ Closed.php:

<?php
namespace App\Jobs;
use App\Events\Closed;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class Close implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public function __construct(){}
    public function handle()
    {
        event(new Closed());
    }
}

此时我需要解释两种强制性情况。

第一个是我需要将作业Close类创建为一个作业,因为我需要延迟执行任务关闭。我可以看到实现这种“延迟”的唯一方法是使用Job Class。

第二个是我选择在Closed类中实现“ShouldBroadcastNow”而不是“ShouldBroadcast”,因为我不想将广播排队。

现在问题是跑完后:

<?php
namespace App\Events;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class Closed implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public function __construct(){}
    public function broadcastOn()
    {
        return ['updates'];
    }
    public function broadcastAs()
    {
        return 'closed';
    }
    public function broadcastWith()
    {
        return ['message' => 'Is Closed!'];
    }
}

我在命令控制台上输入以下输出:

处理:App \ Jobs \ Closing

已处理:App \ Jobs \ Closing

处理:App \ Jobs \ Close

处理:App \ Events \ Closed

失败:App \ Events \ Closed

失败:App \ Jobs \ Close

我发现奇怪的第一件事是App \ Events \ Closed尽管它实现了“ShouldBroadcastNow”,但仍然排队。

在laravel.log上,它似乎发生在PusherBroadcaster.php的BroadcastException。

但如果在控制器中我做了:

php artisan queue:work --tries=1

通过推送器将事件正确地广播到客户端浏览器。

出了什么问题?

还有其他方法可以延迟没有工作的“关闭”吗?

目的是拥有以下工作流程:

1 - 我们有一个名为“关闭”的事件是另一个名为“已关闭”的事件;

2 - 我们有一个名为“close”的任务,在事件“关闭”后“x”秒发生,其中“x”是一个随机数;

3 - 执行“关闭”任务后,我们广播事件“已关闭”。

感谢您关注我的问题

1 个答案:

答案 0 :(得分:0)

与此同时,我发现这是一个众所周知的问题(https://github.com/laravel/framework/issues/16478)。

可以通过两种方式解决:

1 - 编辑相关的php.ini文件(在我的情况下是mamp / conf / php7.0.9 / php.ini和mamp / bin / php / php7.0.9 / php.ini)指向的位置卷曲证书;

2 - 编辑config / broadcasting.php(在推送选项中将加密设置为false)。