Laravel事件Event初尝试
1,需要注册事件或侦听器
<?php namespace App\Providers; use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * 注册事件和侦听器. * * @var array */ protected $listen = [ 'App\Events\SomeEvent' => [ // 事件类 'App\Listeners\EventListener', // 侦听类1 'App\Listeners\EventListenerOther', // 侦听类2... ], ]; /** * Register any other events for your application. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); // } }
注册完事件或侦听器后,可使用 php artisan event:generate 创建事件或侦听器类。
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class SomeEvent extends Event { use SerializesModels; public $data; /** * 创建一个事件实例. * 接收数据,供侦听类使用 * * @return void */ public function __construct($data) { $this->data = $data; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return []; } }
3,创建侦听类
<?php namespace App\Listeners; use App\Events\SomeEvent; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; /** * 事件侦听类1 * 这是一个可队列的异步事件侦听器 * * @package App\Listeners */ class EventListener implements ShouldQueue { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param SomeEvent $event * @return void */ public function handle(SomeEvent $event) { var_dump($event->data); echo '这里是第一个事件<hr>'; } }还有
<?php namespace App\Listeners; use App\Events\SomeEvent; /** * 事件侦听类2 * * @package App\Listeners */ class EventListenerOther { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param SomeEvent $event * @return void */ public function handle(SomeEvent $event) { var_dump($event->data); echo '这里是第二个事件<hr>'; return false; // 从这里停止事件传播 } }
4,触发事件
<?php namespace App\Http\Controllers; use App\Events\SomeEvent; use Illuminate\Http\Request; use Illuminate\Support\Facades\Event; class HomeController extends Controller { /** * 首页 * * @param Request $request * @return array */ public function getIndex(Request $request) { // 获取数据 $data = $request->all(); // 触发事件 Event::fire(new SomeEvent($data)); } }
至此,一套完整的事件流程就成功了!