1.事件监听
有时候我们需要在执行完一步操作后自动执行下一步事件,比如在用户购买商品后增加到购买记录的同时将商品增加到订单表中。
首先需要注册事件/监听器,在\app\Providers\EventServiceProvider.php
文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 protected $listen = [ 'SocialiteProviders\Manager\SocialiteWasCalled' => [ 'SocialiteProviders\Weibo\WeiboExtendSocialite@handle' , 'SocialiteProviders\QQ\QqExtendSocialite@handle' , ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LoginStoreSession' , ], 'App\Event\Order' => [ 'App\Listeners\CreateOrder' , ], ];
之后执行php artisan event:generate
会分别自动在app/Events
和app/Listensers
目录下生成 Order.php和CreateOrder.php文件。 Order.php文件中是定义变量与监听器进行变量传递的过程,其中变量可以是表单数据,也可以是自带的数据参数,我们这里自定义一个$data数组用于将数据写入写入订单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Order { use Dispatchable , InteractsWithSockets , SerializesModels ; public function __construct ($data ) { $this ->data = $data ; } public function broadcastOn ( ) { return new PrivateChannel('channel-name' ); } }
然后去app\Listeners
目录CreateOrder.php文件中创建各种要做的事件监听类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public function __construct ( ) { } public function handle (Order $event ) { $data = $event ->data; DB::table('orders' )->insert($data ); }
监听器在handle方法中接收事件的实例,你可以获取到Order实例中的所有属性以及使用。我们这里是直接将$data数据直接从实例Order中拿到并使用。
那么事件与监听器都设置好了,接下来就是如何触发事件即监听:
1 2 3 4 5 use App \Event \Order ; DB::table('purchase_records' )->insert($data ); Event::fire(new Order($data ));
当然,你也可以使用助手函数来增加触发事件:
1 2 event(new Order($data ));