Laravel事件Event初尝试

DATE: 2016-11-15 / VIEWS: 6349

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 创建事件或侦听器类。


2,创建事件类,接收数据,供侦听类使用
<?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));
    }
    
}


至此,一套完整的事件流程就成功了!