我们使用一个
post
模型
<?php
namespace App;
use App\Events\PostWasPublished;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $events = [
'created' => PostWasPublished::class , //key就是事件的名字,值就是触发的事件。这个事件可以是一个完整的类
];
}
当执行到这个model里面created方法的时候,会触发PostWasPublished事件。这个事件也就是PostWasPublished类里面的代码。它背后的监听着,其实就是PostWasPublishedListenr类里面的代码
然后我们去
EventServiceProvider
类里面修改$listen
属性
protected $listen = [
'App\Events\PostWasPublished' => [
'App\Listeners\PostWasPublishedListenr',
// 如果一个事件需要发送给多个监听者,我们只需要把监听的类写入这个数组里面
],
];
此时执行
php artisan event:generate
会生成两个类
Events文件
中生成PostWasPublished
类,Listeners文件
中生成PostWasPublishedListenr
类,也就是上面$listen
属性定义的两个类。
PostWasPublished发布类
<?php
namespace App\Events;
use App\Post;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class PostWasPublished
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $post; // 注意此处要被继承使用,必须用publish
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Post $post)
{
$this->post = $post;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
PostWasPublishedListenr监听类
<?php
namespace App\Listeners;
use App\Events\PostWasPublished;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class PostWasPublishedListenr
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param PostWasPublished $event
* @return void
*/
public function handle(PostWasPublished $event)
{
// 因为监听类PostWasPublished里面注入了Pos这个model类,所以我们可以直接使用Post里面的函数
dump($event->post->toArray());
}
}
路由
注意此处用的是 create 而不是created
Route::get('/', function () {
return \App\User::create(['name'=>'name','email'=>'62em11ail3@qq.com','password'=>'password']);
});
也可以直接在路由里使用event全局函数做触发
以下方式跟User的模型里面 $events 属性就没有关系了,这是直接触发的
这种打方式会触发两次事件
Route::get('/', function () {
$user = \App\User::create(['name'=>'name','email'=>'652em11ail3@qq.com','password'=>'password']);
event(new \App\Events\PostPublished($user));
});
这种方式会触发一次事件
Route::get('/', function () {
$user = \App\User::find(2);
event(new \App\Events\PostPublished($user));
});
- 但是可以监听的事件只有以下函数中的那些