最近要写一个聊天室,于是了解了一下laravel的事件广播,参考资料来源于http://laravelacademy.org/pos... 但是在跟随博主动手的时候, 发现事件成功触发, 但是pusher调试控制台上并没有收到事件。经过调试找到问题所在。
首先我们先创建一个事件:
php artisan make:event TestEvent
最终, 事件的代码如下, 这里有一个注意点就是
如果该事件没有继承use IlluminateContractsBroadcastingShouldBroadcast; 接口,那么触发事件,将不会发送事件至pusher 服务器上.
use ...
// 如果该事件没有继承use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 接口,那么触发事件,将不会发送事件至pusher 服务器上.
class TestEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
// 类型需为public
public $msg;
public function __construct($msg)
{
$this->msg = $msg;
}
public function broadcastOn()
{
return [
'test'
];
}
}
为了测试方便,我们创建一个artisan 命令来触发事件.
php artisan make:command TestEventCommand
打开命令类 app/Console/Commands/TestEventCommand.php 编辑后如下
class TestEventCommand extends Command
{
protected $signature = 'pusher:test {message}';
protected $description = 'pusher test';
public function __construct()
{
parent::__construct();
}
public function handle()
{
event(new \App\Events\TestEvent($this->argument('message')));
}
}
打开 app/Console/Kernel.php, 将刚创建的命令类添加至 $commands
protected $commands = [
Commands\TestEventCommand::class,
];
事件代码基本完成, 接下来导入pusher
composer require pusher/pusher-php-server
当pusher 成功导入之后 需要在env中配置, BROADCAST_DRIVER 需配置为pusher。 config/broadcasting.php 文件 BROADCAST_DRIVER 默认为null
- PUSHER_APP_ID=you_app_id
- PUSHER_APP_KEY=you_app_key
- PUSHER_APP_SECRET=you_app_secret
- BROADCAST_DRIVER = pusher
另外在这里测试发现如果 QUEUE_DRIVER 配置是redis 那么当触发事件的时候不会调用IlluminateBroadcastingBroadcastManager 下的createPusherDriver方法.也就是不生成pusher类发送事件. QUEUE_DRIVER应配置为sync
配置完成之后 我们就可以通过artisan 命令向pusher服务器发送事件,
php artisan pusher:test "hello"
那么,将会在pusher debug-console 上看到