Laravel如何使用服务器发送事件捕获事件

时间:2019-10-25 16:11:20

标签: laravel event-handling server-sent-events

Laravel SSE(服务器发送事件)是将更改推送到前端的绝佳解决方案,但是,在服务器端,我们需要一种有效的方法来跟踪更新记录,然后再将通知发送给前端。但是,SSE要求控制器与之配合使用,问题在于控制器如何捕获Laravel事件?

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
     [java]     at java.util.BitSet.initWords(BitSet.java:166)
     [java]     at java.util.BitSet.<init>(BitSet.java:143)
     [java]     at edu.umd.cs.findbugs.ba.LiveLocalStoreAnalysis.createFact(LiveLocalStoreAnalysis.java:58)
     [java]     at edu.umd.cs.findbugs.ba.LiveLocalStoreAnalysis.createFact(LiveLocalStoreAnalysis.java:45)
     [java]     at edu.umd.cs.findbugs.ba.Dataflow.execute(Dataflow.java:318)
     [java]     at edu.umd.cs.findbugs.classfile.engine.bcel.LiveLocalStoreDataflowFactory.analyze(LiveLocalStoreDataflowFactory.java:68)
     [java]     at edu.umd.cs.findbugs.classfile.engine.bcel.LiveLocalStoreDataflowFactory.analyze(LiveLocalStoreDataflowFactory.java:38)
     [java]     at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.analyzeMethod(AnalysisCache.java:369)
     [java]     at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getMethodAnalysis(AnalysisCache.java:

1 个答案:

答案 0 :(得分:0)

Laravel提供事件,侦听器,广播和通过事件与前端通信的渠道。您无需在控制器中执行此操作。您可以在

中定义广播路线
routes/channels.php

然后,您可以定义默认情况下在脚手架中包括广播方法的事件。

public function broadcastOn()
{
    return new PrivateChannel('channel-name');
}

将事件的侦听器绑定到事件,并实现“应该”接口以将其作为异步作业运行。您还可以使用laravel通知来提供实时通知。 laravel broadcasting

如果您仍想在控制器中捕获事件,则可以在EventServiceProvider中指定为

class EventServiceProvider extends ServiceProvider
{

    protected $listen = [
        DownloadFile::class => [
          CompanyDashboardController::class,
        ],
    ];

    public function boot()
    {
        parent::boot();
    }
}

您的活动看起来像

class DownloadFile
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $process_id;

    public function __construct($process_id)
    {
        $this->process_id = $file;
    }
}

最后,您可以像下面这样在控制器中捕获此事件:

class CompanyDashboardController extends Controller
{

    public function __construct()
    {
      //constructor
    }
    public function handle(DownloadFile $event)
    {
        if($event->process_id == 1)
        {
            return "something";
        }

    }
}

如果您打算使用某个Javascript事件而不是Laravel,请阅读  Use Server-Sent Events to push messages to browser

相关问题