Thinkphp 이벤트 메커니즘을 구현하는 방법

PHPz
풀어 주다: 2023-06-02 17:37:22
앞으로
858명이 탐색했습니다.

    이벤트 메커니즘을 구현하는 방법에는 모니터링과 구독을 통한 두 가지가 있습니다.

    1. 모니터링을 통해

    1 청취 클래스 생성: 명령줄 모드에서 프레임워크 루트 디렉터리에 들어가

    php를 실행합니다. make:listener

    예:

    php make:listener UserListener

    가 실행 후 <프레임워크 루트 디렉토리>applistener下生成UserListener 클래스에 있을 것이라고 생각하세요.

    2. 청취 구성: <프레임워크 루트 디렉터리>appevent.php 파일의 청취 배열에서 다음과 같이 UserListener 클래스를 구성합니다.

    'listen' => applistenerUserListener']
    ],

    3. 청취 트리거: 청취를 트리거해야 하는 곳에 다음 코드를 추가하세요

    event(&#39;testEvent&#39;);
    로그인 후 복사

    참고: 여기에서 testEvent 매개변수는 마음대로 정의할 수 있는 이벤트 이름이지만 event.php와 동일 파일에 구성된 키 이름은 일관됩니다.

    모니터링을 실행할 때 두 번째 매개변수를 가져올 수 있습니다. 핸들 메소드의 매개변수인 두 번째 매개변수를 통해 UserListener 클래스에 어떤 데이터든 전달할 수 있습니다. (무엇을 의미하는지 이해하지 못하는 경우 아래 전체 코드를 통해 이해하시기 바랍니다.)

    4. 듣기 로직 처리: UserListener 클래스의 핸들 메소드에서 비즈니스 로직 완성

    전체 코드는 다음과 같습니다.

    Other: 테스트에 사용되는 클래스

    <?php
    namespace app\controller;
    class Other
    {
        public function hello()
        {
            echo &#39;hello function&#39;;
        }
    }
    로그인 후 복사

    Index: 듣기를 트리거하는 클래스

    로그인 후 복사

    UserListener: 이벤트 청취 클래스

    <?php
    namespace app\listener;
    class UserListener
    {
        /**
         * 事件监听处理
         *
         * @return mixed
         */
        public function handle($event)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($event);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($event);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $event->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $event->hello();
        }
    }
    로그인 후 복사

    2. 구독을 통해

    1. 구독 클래스를 생성합니다

    실행하려면 명령줄 모드에서 프레임워크 루트 디렉토리를 입력하세요.

    php make:subscribe <사용자 정의 클래스 이름>

    예:

    php think make:subscribe UserSubscribe

    실행 후 UserSubscribe 클래스는 <프레임워크 루트 디렉터리>appsubscribe 아래에 생성됩니다.

    2. 모니터링 구성

    <프레임 루트 디렉터리>appevent.php 파일의 구독 배열에서 UserSubscribe 클래스를 다음과 같이 구성합니다.

    'subscribe' => ['appsubscribeUserSubscribe'],

    참고: 효과를 테스트하려면 위에서 구성한 UserListener를 Listen 배열에서 삭제해야 합니다

    3. Trigger listening

    첫 번째 방법과 동일

    4. Listening 로직을 처리하는 방법에는 두 가지가 있습니다. 이것을 자동 바인딩과 수동 바인딩이라고 부릅니다. 수동 바인딩과 자동 바인딩은 상호 배타적이므로 둘 중 하나만 선택할 수 있습니다.

    4.1 자동 바인딩

    비즈니스 로직을 완성하는 ontestEvent 메소드를 UserSubscribe 클래스에 추가해야 합니다. 추가되는 메소드 이름은 임의로 정의할 수 없으며, 이벤트 이름 앞에 추가하는 것을 원칙으로 합니다. event.php에서 정의한 이벤트 이름이 testEvent이므로 메소드 이름은 ontestEvent입니다(대소문자 주의). Listening 메서드를 정의한 후에는 자동으로 이벤트에 바인딩되므로 자동 바인딩이라고 합니다.
    전체 코드는 다음과 같습니다

    Other 및 Index 클래스의 코드는 첫 번째 접근 방식과 동일합니다.

    UserSubscribe: 이벤트 구독 클래스

    <?php
    namespace app\subscribe;
    class UserSubscribe
    {
        public function ontestEvent($user)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }
    로그인 후 복사

    4.2 수동 바인딩

    먼저 처리를 담당하는 이벤트 클래스를 만듭니다. 특정 비즈니스 로직. 명령줄 모드에서 프레임워크 루트 디렉터리를 입력하고 실행합니다.

    php think make:event

    예:

    php think make:event UserEvent

    실행 후 < ;The UserEvent 클래스는 프레임워크 루트 디렉터리>appevent 아래에 생성됩니다.

    그런 다음 이 클래스에 들어오는 매개변수가 있는 핸들 메서드를 정의합니다. 메소드 이름과 전달되는 매개변수 이름은 임의로 정의할 수 있습니다. 특정 비즈니스 로직은 핸들 메소드에서 처리될 수 있습니다.

    다음으로, Event 개체를 매개변수로 받아야 하는 구독 메서드를 UserSubscribe 클래스에 추가합니다. 그런 다음 이벤트 리스너를 이 함수에 있는 UserEvent 클래스의 핸들 메서드에 바인딩합니다.

    $event->listen(&#39;testEvent&#39;, [app(&#39;app\event\UserEvent&#39;), &#39;handle&#39;]);
    로그인 후 복사

    전체 코드는 다음과 같습니다

    Other 및 Index 클래스의 코드는 첫 번째 접근 방식과 동일합니다.

    UserSubscribe: 이벤트 구독 클래스

    로그인 후 복사

    UserEvent: 이벤트 처리 클래스

    <?php
    declare (strict_types = 1);
    namespace app\event;
    class UserEvent
    {
        public function handle($user)
        {
            //当调用Index类的test1方法时该代码有效,$user为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$user为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$user为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$user为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }
    로그인 후 복사

    위 내용은 Thinkphp 이벤트 메커니즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿
    회사 소개 부인 성명 Sitemap
    PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!