gpt4 book ai didi

laravel - laravel事件从 Controller 分派(dispatch)

转载 作者:行者123 更新时间:2023-12-03 01:00:20 26 4
gpt4 key购买 nike

好的,所以我一直在尝试通过并发编辑设置电子表格应用程序。我走了laravel回声,redis,套接字路由。 (任何有关仅使用推动器的建议都会被驳回)。现在大多数情况下,我已经开始工作了,我可以从修补匠中调用我的事件,并查看我想通过Redis流向套接字的数据,并由我的前端获取。但是,将呼叫放在控制器中后根本无法正常工作;就像它只是被忽略。为了简单起见,我从控制器功能中删除了除event(new SalesPricingReportEdit($request));之外的所有代码,我可以在修补程序中使用此确切的代码来存储来自开发工具{"change":[[0,"future contract price",null,750]],"customer_id":101443,"item_id":"MOFT0602-1-550"}的确切请求源,并且我的ws在不同计算机上对页面的多个实例进行响应并将数据附加到WS。我可以发布任何需要帮助的代码,只要让我知道您想看什么即可。

编辑(已解决):好的,现在我基本上完成了这个项目,我写了我的文章,我想为后代张贴ID,这是一个过程指南,使我成功地通过echo将laravel事件与redis和socket-io一起使用。


在laravel中注册新事件,请转到app / Providers / EventServiceProvider.php,并为尚不存在的事件输入完全命名空间的路径。使用默认名称空间将使您免于麻烦,但是您可以使用非默认名称空间
如果您希望在尝试将事件路由到前端时自己挖洞。

protected $listen = [ 'App\Events\EventName.php' => [
//you would put a handler here but for my case i was only dealing with an
//Event generated by server and handled by the client(browser)
//so it wasn't needed. KISS
],

保存后,只需使用artisan generate event命令,它将读取侦听器数组并为您提供事件支架。
注意:虽然我们位于providers文件夹中,但请仅注意broadcastServiceProvider及其对路由/频道文件的引用,这对我来说现在并不重要,但要记住
在您的app / Events / EventName.php中,我们将配置事件。这些大多数都是标准的,但是会有一些我不想忘记的陷阱。
您的班级应默认实现ShouldBroadcast ...我将其更改为ShouldBroadcastNow,并在全局.env和配置中将我的默认QUE_DRIVER = sync设置为sync ..这只是避免了排队作业的额外开销。从长远来看,但就目前而言,排队有点过头了。
继续在app / Events / EventName.php中
接下来注意您的构造函数。要通过事件传递数据,您需要在类中声明一个公共变量,并在构造函数中设置该变量的值。默认情况下,laravel将/应该/应该在
与事件一起上课。

公开兑换;

公共功能__construct($ request){
$ this-> change = json_decode($ request,true);
}


接下来,在您的broadcastOn()函数中,您想返回一个新频道...尤其是

 return new [Type]Channel([channel-name]);


确保在标题中具有所需的所有外墙。

broadcastWith()函数将使您能够处理随事件发送的数据。
我没有使用broadcastAs()函数,但是它应该允许您更改事件名称,而不是使用默认的类名称。


现在,我们将转到控制器文件,我们计划在该文件中实际从app / Http / Controllers / xxxxxxxxxController.php触发事件
使用语法

event(new EventName($data))


当您希望事件开始时。由于我们尚未设置Redis或套接字,因此无法正常工作,但要测试所有工作是否正常,请转至.env并更改BROADCAST_DRIVER = log。一旦完成擦除缓存并执行所需的所有操作,以使控制器功能运行(通过使用修补程序或计划与该事件一起使用的前端路径)。然后,您应该能够看到storage / app / logs / laravel.log包含事件信息。


继续并在您的服务器上安装redis,并在.env和config / database.php中使用基本的laravel配置,唯一要更改的是添加.env BROADCAST_DRIVER = redis。
为了避免一些麻烦,请确保将您的CACHE_DRIVER归档。
我尚未使用Redis设置多连接,以使Redis既可以用作广播也可以用作缓存。如果有可能,但我还没有做到。所以现在cache_driver可以消失了。
我也尝试使用PHPredis进行设置,但我承认失败并只是使用了predis。任何能弄清楚这一点的人我都会赚50美元。
最后,测试您是否正确执行了此操作


redis-cli> PING ... resp:PONG

您也可以使用redis-cli监视器来验证事件数据确实已推送到redis。


现在我们将使用npm开始安装,我们将安装laravel-echo-server,我还将获得pm2软件包作为我的echo服务器守护进程。

`#!/ var / www / repoting / bash

laravel回声服务器开始`


然后只需运行pm2 start socket.sh
在测试时,您可能想直接从cli运行laravel-echo-server,因为输出流将在您观察到Redis中广播的事件时通知您。


我们还需要


npm --save socket.io-client

或websockets不起作用。


让我们转到resources / assets / js / bootstrap.js

从“ laravel-echo”导入Echo;

window.io = require('socket.io-client');

如果(typeof io!=='undefined'){

       window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001',
});


}


这正在初始化我们的websocket连接。


现在,在我们的刀片文件中,我们将订阅该频道并监听事件。确保包含:6001 / socket.io / socket.io.js文件,否则回调将失败
为什么我们在您要求的bootstrap.js中不这样做?因为我正在使用的通道名称的一部分已由控制器随视图传递,所以要订阅正确的通道,我需要
channel-name-{{$customer_id}}.
您说的是,我应该正确地设置vue并按照其在vue中设计的方式进行操作....回家喝醉。


所以现在在resources / views / xxxxx.blade.php中

我将它与handontables结合使用,因此我要将侦听器插入afterRender钩子中。

         Echo.channel('EventName-{{$customer_id}}')
.listen('EventName',function(data){
console.log(data);
});


此处关于通道中的内容与listen子句中的内容的任何混淆都可以认为是使用channelName,然后使用eventName,默认情况下是类名称。过去似乎有一些问题
类名已正确命名,但我没有遇到任何问题。

所有这些都将导致在该频道订阅的任何页面上看到带有您的事件数据的console.log。但是为了繁荣起见,这里是测试顺序,以帮助验证过程中的每个步骤。

故障排除步骤


是否在laravel中正确配置了事件?更改BROADCAST_DRIVER = log,并在运行控制器时验证是否获得了日志条目。
数据实际上是否已推送到Redis?正确的频道等?触发事件时打开redis-cli montior,您应该会看到“ PUBLISH”,“ channel-name”,“ message”之类的反馈
echo服务器/ socketio服务器是否正在注册事件?查看正在运行laravel-echo-server start命令的终端,您应该看到事件从redis传播到那里进行回显
bootstrap.js文件是否为您提供了开放的Web套接字?转到开发工具并检查network-> ws,如果看到条目,请单击该条目,然后在消息上;确保您看到已发送和已接收的数据。如果您不这样做,bootstrap.js中会有问题
您的客户端js是否正在从websocket事件中检索数据?如果不是,您可能忘记了包含socket.io.js文件。


下一步

-实施耳语通道,以通知页面当前正在使用该页面的用户,以及取消订阅echo通道并删除任何不需要的侦听器

-通过耳语通道传递可手动切换的选定数据,并将那些单元格设置为只读(如果用户不同于当前用户)

最佳答案

我最终只是添加了redis外观并调用Redis :: publish()。我的猜测是,如果没有监听器设置,我将无法调用事件。我不需要侦听器,我只需要触发该事件并将其推送到Redis。真正令人困惑的部分是,为什么这种方法在修补程序中而不是在控制器中不会出现故障仍然是一个谜,但是,我解决了眼前的问题,因此这只能归结为一个极端的情况,在该情况下,我实现的功能可能与设计时有所不同是。

关于laravel - laravel事件从 Controller 分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com