10/11/2018, 08:49

Event trong laravel

Sự kiện là một cách tuyệt vời để tách riêng các khía cạnh khác nhau của ứng dụng của bạn, vì một sự kiện đơn lẻ có thể có nhiều người nghe không phụ thuộc lẫn nhau. Ví dụ: bạn có thể gửi thông báo Slack cho người dùng của mình mỗi lần đơn đặt hàng được giao. Thay vì ghép mã xử lý đơn đặt hàng của bạn vào mã thông báo Slack, bạn có thể tăng sự kiện OrderShipped, mà người nghe có thể nhận và chuyển đổi thành thông báo Slack.

Sự kiện của Laravel cung cấp một sự thực hiện quan sát đơn giản, cho phép bạn đăng ký và lắng nghe các sự kiện khác nhau xảy ra trong ứng dụng của bạn. Các lớp sự kiện thường được lưu trữ trong thư mục app/Events, trong khi các trình lắng nghe của chúng được lưu trữ trong app/Listeners Đừng lo lắng nếu bạn không thấy các thư mục này trong ứng dụng của bạn, vì chúng sẽ được tạo cho bạn khi bạn tạo các Event và Listener bằng cách sử dụng  Artisan Command

Sự kiện là một cách tuyệt vời để tách riêng các khía cạnh khác nhau của ứng dụng của bạn, vì một sự kiện đơn lẻ có thể có nhiều trình nghe không phụ thuộc lẫn nhau. Ví dụ: bạn có thể gửi thông báo Slack cho người dùng của mình mỗi lần đơn đặt hàng được giao. Thay vì ghép mã xử lý đơn đặt hàng của bạn vào mã thông báo Slack, bạn có thể phát động sự kiện OrderShipped, mà trình lắng nghe có thể nhận và chuyển đổi thành thông báo Slack.

Đăng ký Event và Listener

EventServiceProvider đi kèm với ứng dụng Laravel của bạn cung cấp một nơi thuận tiện để đăng ký tất cả các trình lắng nghe sự kiện của ứng dụng của bạn. Thuộc tính listen chứa một mảng của tất cả các sự kiện (các khóa) và các bộ lắng nghe của chúng (các giá trị). Tất nhiên, bạn có thể thêm nhiều sự kiện vào mảng này khi ứng dụng của bạn yêu cầu. Ví dụ, chúng ta hãy thêm một sự kiện OrderShipped:

 

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

Tất nhiên, tạo thủ công các tệp cho mỗi sự kiện và người nghe là cồng kềnh. Thay vào đó, hãy thêm người nghe và sự kiện vào EventServiceProvider của bạn và sử dụng event:generate command. Lệnh này sẽ tạo ra bất kỳ sự kiện hoặc người nghe nào được liệt kê trong EventServiceProvider của bạn. Tất nhiên, các sự kiện và trình lắng nghe đã tồn tại sẽ bị bỏ qua:


Manually Registering Events

Đăng ký sự kiện theo cách thủ công
Thông thường, các sự kiện phải được đăng ký thông qua mảng  EventServiceProvider  $listen, tuy nhiên bạn cũng có thể đăng ký các sự kiện dựa trên Closure theo cách thủ công trong phương thức boot của EventServiceProvider của bạn:
 

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

    Event::listen('event.name', function ($foo, $bar) {
        //
    });
}

Wildcard trình lắng nghe sự kiện

Bạn thậm chí có thể đăng ký người nghe bằng cách sử dụng * như một tham số ký tự đại diện, cho phép bạn nắm bắt nhiều sự kiện trên cùng một Listener. Trình nghe theo ký tự đại diện nhận tên sự kiện làm đối số đầu tiên của chúng và toàn bộ mảng dữ liệu sự kiện làm đối số thứ hai của chúng:
 

Event::listen('event.*', function ($eventName, array $data) {
    //
});

Định nghĩa Event
Một Event class là vùng chứa dữ liệu chứa thông tin liên quan đến sự kiện. Ví dụ, giả sử sự kiện OrderShipped được tạo của chúng ta nhận được một đối tượng ORM Eloquent:
 

<?php

namespace App\Events;

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

class OrderShipped
{
    use SerializesModels;

    public $order;

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

Như bạn có thể thấy, Event Class này không chứa logic. Nó là một container cho cá thể Order đã được mua.

Defining Listeners


Tiếp theo, chúng ta hãy nhìn vào Listener cho ví dụ của chúng ta. Người nghe sự kiện nhận được cá thể  Event OrderShipped trong phương thức handle của chúng . event:generate command sẽ tự động nhập lớp sự kiện thích hợp và gợi ý kiểu sự kiện trên phương thức handle Trong phạm vi xử lý, bạn có thể thực hiện bất kỳ hành động nào cần thiết để trả lời sự kiện:
 

<?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)
    {
        // ví dụ gửi email đến khách hàng thông báo đơn hàng đã được giao
    }
}

Event Subscribers
Event subscribers là các lớp có thể đăng ký nhiều sự kiện từ bên trong class, cho phép bạn xác định một số trình xử lý sự kiện trong một class duy nhất. Event subscribers phải xác định phương thức đăng ký, phương thức này sẽ được chuyển qua một bản sao của Event dispatcher. Bạn có thể gọi phương thức listen trên bộ điều phối đã cho để đăng ký trình nghe sự kiện:

<?php

namespace App\Listeners;

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

    /**
     * Handle user logout events.
     */
    public function onUserLogout($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@onUserLogin'
        );

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

Đăng ký Event Subscribers
Sau khi tạo Event subscriber, bạn đã sẵn sàng để đăng ký nó với Bộ điều phối sự kiện (Event Dispatcher). Bạn có thể đăng ký Subscriber 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
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        //
    ];

    /**
     * The subscriber classes to register.
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\UserEventSubscriber',
    ];
}
Bài liên quan

Event trong laravel

Sự kiện là một cách tuyệt vời để tách riêng các khía cạnh khác nhau của ứng dụng của bạn, vì một sự kiện đơn lẻ có thể có nhiều người nghe không phụ thuộc lẫn nhau. Ví dụ: bạn có thể gửi thông báo Slack cho người dùng của mình mỗi lần đơn đặt hàng được giao. Thay vì ghép mã xử lý đơn đặt hàng của ...

Hoa Nguyen viết 08:49 ngày 10/11/2018

Tìm hiểu Event trong Laravel

Xin chào anh em, cũng đã khá lâu mình mới lại viết bài chia sẻ về những điều thú vị trong Laravel. Để tiếp tục series Laravel và những điều thú vị này , hôm nay mình sẽ cùng tìm hiểu và chia sẻ về Event trong Laravel nhé. Event là sự kiện , là một hành đông hay một tác vụ nào đó xả ra ở một ...

Tạ Quốc Bảo viết 18:27 ngày 12/08/2018

Event trong Laravel

Mở đầu Event là sự kiện là một hành động hay một tác vụ nào đó xảy ra ở một thời điêm xác định.Trong đời thường cũng như trong quá trình hoạt động của một ứng dụng có rất nhiều event xảy ra. Ví dụ như trong ứng dụng web của chúng ta khi người dùng click lên một button là một sự kiện, khi người ...

Bùi Văn Nam viết 16:59 ngày 12/08/2018

Tự động hóa front-end vs Laravel Mix trong Laravel(P2)

Hi guys, nay mình lại quay trở lại với P2 đây. Ở phần 1 mình đã giới thiệu sơ qua cho các bạn về Laravel-Mix và thành quả mà nó mang lại rồi. Phần này chúng ta sẽ bắt tay vào code nhé (Bài này mình demo dựa trên source code của laravel 5.6). Phần này nếu bạn nào chưa biết về reactjs or chỉ ...

Tạ Quốc Bảo viết 20:57 ngày 11/08/2018

Thủ thuật Eloquent trong Laravel

Trong bài viết này, mình sẽ chia sẻ một vài thủ thuật hay mà bạn có thể làm với Eloquent của Laravel. Như chúng ta đã biết thì Laravel hỗ trợ cho chúng ta nhiều cách để tương tác với cơ sở dữ liệu. Và Eloquent ORM là một thế mạnh rất lớn Laravel có trong khi các framework không hỗ trợ. Vì vậy tại ...

Hoàng Hải Đăng viết 20:57 ngày 11/08/2018
+3