laraver 事件系统 缓存系统

Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件.
优点:事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。

1.生成一个事件:

php artisan make:event name
<?php

namespace App\Events;

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;
use App\Http\Controllers\EmailController;

class UserLogin
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
    //发送邮件
    public function sendEmail() {
        $email = new EmailController();
        $email->sendEmail();
    }
}

2.定义监听器

一个事件可以被一个或多个监听器监听
EventServiceProvider 的 $listen 中可以定义事件和监听器

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        'App\Events\UserLogin' => [
            'App\Lisenter\sendEailListen',
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

3.生成监听器

php artisan event::generate
<?php

namespace App\Lisenter;

use App\Events\UserLogin;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class sendEailListen
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserLogin  $event
     * @return void
     */
    public function handle(UserLogin $event)
    {
        $event->sendEmail();
        //业务逻辑
    }
}

4.分发和触发事件

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Model\User;
class LoginController extends Controller
{
    //
    public function login(Request $request) {
        $account  = $request->input('account')  ?? 17601623105;
        $password = $request->input('password') ?? 123456;
        $where = array(
            'account' => $account,
            'password' => $password
        );
        $user  = User::where($where)->first();
        if($user){
            //逻辑
                //分发事件
            event(new UserLogin());
        }else{
                 echo  222;
        }
    }
}


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容