>PHP 프레임워크 >Laravel >laravel 이벤트의 구현 원리를 알고 계시나요?

laravel 이벤트의 구현 원리를 알고 계시나요?

藏色散人
藏色散人앞으로
2020-06-22 13:55:193821검색

다음 튜토리얼 칼럼인 Laravel에서는 라라벨 이벤트의 구현 원리를 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

laravel 이벤트의 구현 원리를 알고 계시나요?

사용하기 쉽습니다

1. 이벤트 및 리스너 AppProviders EventServiceProvider

protected $listen = [
        'App\Events\UserAdd' => [
            'App\Listeners\UserAddListener',
        ],
    ];

2의 수신 속성을 구성합니다.

php artisan event:generate

는 AppEventsUserAdd라는 두 개의 클래스를 생성합니다. 및 AppListenersUserAddListener 문서.

이벤트 클래스는 주로 해당 정보를 저장하는 데 사용됩니다. 예를 들어 속성은 사용자 모델 인스턴스를 저장하고 이벤트 클래스 인스턴스는 해당 이벤트 리스너의 핸들 메서드에 전달되어 이벤트 로직을 처리합니다.

public function __construct(User $user)
{
   $this->user = $user;//创建事件实例时保存的信息
}

AppListenersUserAddListener 리스너의 핸들 메소드는 로직이 처리되는 곳입니다.

public function handle(UserAdd $event)
{
        dd($event->user);//获取到对应事件实例的信息
}

3 이벤트를 트리거하려면 공개 함수인 events()를 사용하세요. 해당 이벤트 클래스의 인스턴스를 전달합니다

event(new \App\Events\UserAdd($user));//执行这一步时,就会执行到handle方法

구현 원칙(IlluminateEventsDispatcher 클래스)

public function register()
{
    $this->app->singleton('events', function ($app) {
        return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
            return $app->make(QueueFactoryContract::class);
        });
    });
}

IOC 컨테이너에 등록된 이벤트는 실제로 IlluminateEventsDispatcher 클래스입니다. 즉, Facade Event는 실제로 이 클래스의 메서드를 호출합니다

중요한 속성과 방법 :

protected $listeners = [];
protected $wildcards = [];
protected $wildcardsCache = [];//这三个属性都是配置事件与监听器关系的数组,时间注册进来后就是放到对应的数组里面的。
//这个方法就是注册事件用的,把配置好的事件注入到上面的属性中
public function listen($events, $listener)
    {
        foreach ((array) $events as $event) {
            if (Str::contains($event, '*')) {
                $this->setupWildcardListen($event, $listener);
            } else {
                $this->listeners[$event][] = $this->makeListener($listener);
            }
        }
    }
//这个方法就是执行对应事件监听器的方法,找到事件下面的是所有监听器,然后执行。
public function dispatch($event, $payload = [], $halt = false),

위 내용은 laravel 이벤트의 구현 원리를 알고 계시나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제