美文网首页laravel核心
laravel事件监听--模型事件新特性

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

作者: 云龙789 | 来源:发表于2017-07-07 00:57 被阅读767次

    暂时失败,搞定再修改

    • 我们使用一个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));
    });
    
    图片.png
    • 但是可以监听的事件只有以下函数中的那些
    图片.png

    相关文章

      网友评论

        本文标题:laravel事件监听--模型事件新特性

        本文链接:https://www.haomeiwen.com/subject/oggkhxtx.html