Laravel 8 이벤트와 청취자, 실례 첨부

안녕하십니까? 오늘 저는 Laravel의 사건과 탐지기를 이야기하고 싶습니다. 확장 가능하고 재사용이 가능하며 깨끗한 코드를 작성하는 프로그래밍에서 당신은 몇 가지 프로그래밍 원칙을 따라야 합니다. 그 중 하나는 믿을 만합니다. 오늘은 깊이 있게 설명하지 않겠지만, 저는 하나만 강조할 것입니다. S는 단일 책임 원칙을 대표합니다. 이 원칙은

A class should have one and only one reason to change, meaning that a class should have only one job.


이것은 하나의 클래스가 하나의 임무만 수행해야 한다는 것을 의미한다. 많은 경우에 우리는 항상 많은 기능으로 우리의 클래스를 불러오기 때문에 클래스가 변하면 우리의 응용 프로그램에 많은 문제가 발생할 수 있다. 이것은 좋은 방법이 아니다.
따라서 저는 사건과 청중을 소개하여 우리 교실에서 한 가지 임무만 수행하도록 돕겠습니다.
나를 팔로우하고 더 많은 업데이트를 얻으려면 내 것을 누르십시오.

이벤트가 뭐예요?


이벤트는 우리가 응용 프로그램 활동에 연결하는 방식이다. 이벤트는 단지 활동을 관찰하는 방식일 뿐이다. 예를 들어 로그인은 로그인한 활동을 감시하기 위해 클래스를 만들 수 있고 사용자가 로그인할 때 이벤트 클래스는 일부 기능을 수행할 수 있다.

무엇이 경청자입니까?


탐지기는 그들이 비추는 사건을 탐지하고 임무를 수행하는 클래스입니다. 즉, 사건을 위해 주어진 임무를 수행하는 클래스입니다.
예를 들어 프로그램의 새 사용자에게 환영 이메일을 보내고 등록된 정보에 따라 사용자에게 역할을 할당하기를 원할 수도 있습니다. 등, 우리는 SOLID의 첫 번째 원칙인 컨트롤러가 여러 작업을 수행하기 때문에 Register Controller에서 이 모든 작업을 수행하기를 원하지 않을 것입니다.RegisterController는 새 사용자를 등록하는 활동만 수행합니다.따라서 하나의 사건은 등록 과정에서 진행해야 한다. 등록 과정에서 역할 분배, 이메일 발송 등은 사건 아래의 단일 탐지기다.
본고에 대해 저는 하나의 사건에서 탐지기를 작성할 것입니다. 탐지기는 응용 프로그램의 모든 사용자의 로그인 이름을 하나의 표에 저장하는 것입니다. 이것은 단지 하나의 시범일 뿐입니다. 어떻게 작동하는지 보여 드리겠습니다.
만약 당신이 이미 auth의 laravel 프로젝트가 있다면, 당신은 즉시 관심을 가질 수도 있고, 아니면 나의 글에 관심을 가질 수도 있으며, 나는 나의 시스템에서 이 프로젝트를 사용할 것이다.

1단계: 이벤트 및 탐지기를 EventServiceProvider에 등록


이벤트와 탐지기가 작동할 수 있도록 laravel 프로젝트를 설치할 때 설정된 이벤트 서비스 공급자 클래스에 등록해야 합니다.따라서 app/Providers/EventServiceProvider로 이동하십시오.php 및 클릭

이벤트와 탐지기는 보호된 $listen에서 key=>value 쌍으로 등록되었습니다. 위의 그림에서 알 수 있듯이 이벤트와 탐지기는 이미 등록되었습니다::class는 이벤트이고,sendmailverificationnotification::class는 탐지기이기 때문에 저희만의
<?php

namespace App\Providers;

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

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        LoginHistory::class => [
            StoreUserLoginHistory::class,
        ]
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
우리는 또 다른 LoginHistory라는 이벤트 클래스와 StoreUserLoginHistory라는 탐지기를 추가했고 여기서 App\Events\LoginHistory 방식으로 이 클래스를 호출한 것을 알아차렸다.App\Listeners\storeUserLoginHistory;,걱정하지 마세요. 이 종류가 저희 응용 프로그램에 존재하지 않는다는 것을 알고 싶습니다. 다음 단계에 생성할 것입니다. 이렇게 가능한 한 많은 사건과 탐지기를 추가할 수 있습니다. 심지어 더 많은
 protected $listen = [
        Event1::class => [
            Listener1::class,
            Listener2::class
        ],
        Event2::class => [
            Listener5::class,
            Listener7::class
        ],
        Event3::class => [
            Listener4::class,
            Listener7::class,
            Listener9::class
        ],
 ];

단계 2: 이벤트 및 탐지기 생성


이전에 Event Service Provider에서 이벤트 클래스와 탐지기를 작성했기 때문에 즉시 생성하기 위해 다음 명령을 실행합니다

php artisan event:generate



이 명령은 이벤트 제공 프로그램에서 찾은 모든 이벤트와 탐지기를 자동으로 생성합니다.

3단계: 이벤트 및 탐지기 클래스 작성


프로그램의 모든 로그인 정보를 한 표에 저장하려고 하는 것을 기억하십시오. 따라서 app/Events/LoginHistory를 누르십시오.php 및 편집은 다음과 같습니다.
class LoginHistory
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user)
    {
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}
위의 코드에서 이벤트는 사용자 정보의 $user로 받아들여져 탐지기에 전달됩니다.
app/Listeners/storeUserLoginHistory 를 클릭합니다.php, 우리는 여기에 로그인 역사 저장소의 주요 논리를 작성하고handle 방법에 다음 코드를 추가합니다
    public function handle(LoginHistory $event)
    {
        $current_timestamp = Carbon::now()->toDateTimeString();

        $userinfo = $event->user;

        $saveHistory = DB::table('login_history')->insert(
            ['name' => $userinfo->name, 'email' => $userinfo->email, 'created_at' => $current_timestamp, 'updated_at' => $current_timestamp]
        );
        return $saveHistory;
    }
수업 전에 Carbon과 DB facade를 호출하는 것도 기억해요.
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
우리 청취자 지금 이렇게 보여요.

탐지기에서, 우리는 이름, 전자메일, 창설 시간, 업데이트 시간을 표login\u 역사 기록에 추가하려고 합니다. 즉, 사용자가 로그인할 때, 이 정보를 가져와 표에 저장합니다.

단계 4: 테이블 작성 및 마이그레이션


나는 이 단계에서 깊이 있게 해석할 생각은 없다. 나는 그것들을 해석한 문장이 있다. 내 것에서
마이그레이션 파일 만들기

마이그레이션 파일에 열 추가

마이그레이션

지금 데이터베이스에 저희 시계가 있어요.

단계 5: 이벤트 스케줄링


마지막 단계입니다. Login Controller에서 이벤트를 호출해야 합니다. laravel 7 또는 더 낮은 버전을 사용한다면 Login Controller에서 방법을 만들 수 있습니다.이런 php
    protected function authenticated() {

        $user = Auth::user();

        event(new LoginHistory($user));
    }
하지만 본고에서 저는 Laravel Breeze를 사용하고 있습니다. 16일 전에 발표된 간단한 UI 브래킷이기 때문에 Login Request로 넘어가겠습니다.php는 app/Http/Requests/Auth/LoginRequest에서 찾을 수 있습니다.authenticate () 방법에서 이벤트를 호출하고 $user를 클래스에 전달합니다
  public function authenticate()
    {
        $this->ensureIsNotRateLimited();

        if (! Auth::attempt($this->only('email', 'password'), $this->filled('remember'))) {
            RateLimiter::hit($this->throttleKey());

            throw ValidationException::withMessages([
                'email' => __('auth.failed'),
            ]);
        }

        $user = Auth::user();

        event(new LoginHistory($user));

        RateLimiter::clear($this->throttleKey());
    }
$user=Auth::user();및 이벤트(new LoginHistory($user);,이벤트를 어떻게 스케줄링하는지 주의하십시오. 이벤트를 사용할 수도 있고 이 EventClass를 사용할 수도 있습니다::dispatch();,하지만 이벤트(new LoginHistory($user)를 사용합니다.
따라서 사용자가 로그인을 시도할 때 사용자가 인증을 거치면 이벤트를 터치하고 탐지기는 기록을 저장합니다
이것이 바로 결과입니다. 제가 두 번 로그인했을 때

나의 더 많은 문장에 관심을 가져 주십시오. 당신은 평론, 건의와 반응을 남길 수 있습니다.
나는 모든 PHP 백엔드 엔지니어의 공백에 대해 개방적인 태도를 가지고 있으며, 나의 장점은 Laravel 프레임워크에 있다
시간 내주셔서 감사합니다.

좋은 웹페이지 즐겨찾기