Quay lại

Listen multiple events trong một single class trong Laravel Chuyên mục PHP và Laravel    2023-08-02    228 Lượt xem    71 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Listen multiple events  trong một single class trong Laravel

Observer design pattern là một trong 23 mẫu thiết kế nổi tiếng của “Gang of Four” mô tả cách giải quyết các vấn đề thiết kế định kỳ để thiết kế phần mềm hướng đối tượng linh hoạt và có thể tái sử dụng, tức là các đối tượng dễ triển khai, thay đổi hơn. , kiểm tra và tái sử dụng.

May mắn thay, Laravel cũng đang sử dụng mẫu này để cung cấp cho người dùng sự linh hoạt khi sử dụng các sự kiện trong chính khuôn khổ đó. Về cơ bản, mô hình được chia thành hai phần

  • Events
  • Listeners (Observers)

Sẽ có một “Event” và nhiều “Listeners” để lắng nghe sự kiện đó một cách độc lập. Bây giờ, cách thực hiện điều này trong Laravel là bạn có thể đăng ký tất cả các Events  trong class app/Providers/EventServiceProvider, bên dưới $listen như này.

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'App\Events\OrderCanceled' => [
        'App\Listeners\SendOrderCancelEmail',
        'App\Listeners\InitiateOrderRefund',
    ],
];

Như bạn có thể thấy, có thể có một sự kiện, trong trường hợp của chúng ta là OrderCanceled và những listeners của nó, tức là SendOrderCancelEmailInitiateOrderRefund, v.v.

Bây giờ, khi bạn đăng ký EventServiceProvider , bạn sẽ cần sử dụng php artisan event:generate. Thao tác này sẽ tạo các file.php có liên quan cho các events và listeners trong thư mục app/Eventsapp/Listeners tương ứng.

Vì vậy, bây giờ chúng ta có ba files cho cơ chế Order Cancel event (event Hủy đơn hàng). App\Events\OrderCanceled của chúng ta sẽ được xác định như này.

<?php

namespace App\Events;

use App\Order;
use Illuminate\Queue\SerializesModels;

class OrderCanceled
{
    use SerializesModels;

    public $order;

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

Và Listener có thể được định nghĩa như này.

<?php

namespace App\Listeners;

use App\Events\OrderShipped;

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

    /**
     * Handle the event.
     *
     * @param  \App\Events\OrderShipped  $event
     * @return void
     */
    public function handle(OrderShipped $event)
    {
        // Access the order using $event->order...
    }
}

Như bạn có thể thấy, đối tượng Order mà chúng ta đã pass đến Event có thể được truy cập trong phương thức handle bằng cách sử dụng $event->order được type-hinted bởi event.

Bây giờ, vấn đề ở đây là bạn chỉ có thể nghe một event duy nhất trong một listener class. Nếu bạn muốn listen  nhiều events  trong một single class thì sao? Um thì, để làm được điều đó, bạn có thể sử dụng “Event Subscribers”.

Event Subscribers

Sử dụng event subscribers, bạn có thể listen nhiều events trong một single class. Các lớp này được gọi là "subscribers". Một typical subscriber sẽ trông như này.

<?php

namespace App\Listeners;

class UserEventSubscriber
{
    /**
     * Handle user login events.
     */
    public function handleUserLogin($event) {}

    /**
     * Handle user logout events.
     */
    public function handleUserLogout($event) {}

    /**
     * Register the listeners for the subscriber.
     *
     * @param  \Illuminate\Events\Dispatcher  $events
     */
    public function subscribe($events)
    {
        $events->listen(
            'Illuminate\Auth\Events\Login',
            'App\Listeners\UserEventSubscriber@handleUserLogin'
        );

        $events->listen(
            'Illuminate\Auth\Events\Logout',
            'App\Listeners\UserEventSubscriber@handleUserLogout'
        );
    }
}

Như bạn có thể thấy, những subscribers có thể xác định một phương thức subscribe , phương thức này sẽ được thông qua một  [Illuminate\Events\Dispatcher] instance của event dispatcher. Sau đó, bạn có thể gọi phương thức listen trên dispatcher đã cho để đăng ký nhiều event listeners chấp nhận hai tham số:

  • event (Sự kiện mà bạn muốn đăng ký)
  • method of the subscriber (Phương thức của subscriber sẽ hoạt động như một người quan sát đối với event trong ký hiệu class@method.)

Trong ví dụ trên, chúng ta đã đăng ký hai listeners cho hai subscribers khác nhau.

Registering Subscribers

Sau khi viết subscriber, tất cả những gì bạn phải làm là đăng ký subscriber này, bạn có thể thực hiện việc này bằng cách sử dụng thuộc tính $subscribe trên EventServiceProvider. Ví dụ: hãy thêm UserEventSubscriber vào danh sách:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    // code commented for brevity

    /**
     * The subscriber classes to register.
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\UserEventSubscriber',
    ];
}

Và bạn có thể sử dụng nhiều listeners trong một single class!

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday