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 ...

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',
    ];
}
JCfUZQsq viết 21:09 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
555
JCfUZQsq viết 21:10 ngày 05/04/2022
-1 OR 2+898-898-1=0+0+0+1 --
JCfUZQsq viết 21:10 ngày 05/04/2022
-1 OR 2+67-67-1=0+0+0+1
JCfUZQsq viết 21:10 ngày 05/04/2022
-1' OR 2+804-804-1=0+0+0+1 --
JCfUZQsq viết 21:10 ngày 05/04/2022
-1' OR 2+970-970-1=0+0+0+1 or 'zm1ytlBx'='
JCfUZQsq viết 21:10 ngày 05/04/2022
-1" OR 2+625-625-1=0+0+0+1 --
JCfUZQsq viết 21:10 ngày 05/04/2022
if(now()=sysdate(),sleep(15),0)
JCfUZQsq viết 21:10 ngày 05/04/2022
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z
JCfUZQsq viết 21:10 ngày 05/04/2022
0"XOR(if(now()=sysdate(),sleep(15),0))XOR"Z
JCfUZQsq viết 21:10 ngày 05/04/2022
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
JCfUZQsq viết 21:10 ngày 05/04/2022
-1; waitfor delay '0:0:15' --
JCfUZQsq viết 21:10 ngày 05/04/2022
-1); waitfor delay '0:0:15' --
+3