laravel核心

laravel事件监听--模型事件新特性

2017-07-07  本文已影响767人  云龙789

暂时失败,搞定再修改

<?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));
});
图片.png 图片.png
上一篇 下一篇

猜你喜欢

热点阅读