Laravel – Xử lý sự kiện

Laravel cung cấp chức năng xử lý sự kiện. Khi một sự kiện xảy ra sẽ thực hiện một hành động nào đó. Ví dụ khi có thành viên đăng ký thì gửi mail xác nhận. Cách khai báo một sự kiện như bên dưới:

Step 1 : Tạo class Event.

php artisan make:event <event-class>

Thay <event-class> bằng tên sự kiện muốn tạo. File được tạo sẽ lưu trữ trong thư mục app\Events.

Step 2 : Tạo Listener để xử lý sự kiện vừa mới tạo.

php artisan make:listener <listener-class> --event=<event-class>

Trong đó <event-class> là tên event đã tạo ở step1, <listener-class> là tên Listener xử lý event. File mới tạo sẽ được lưu trữ tại thư mục app\Listeners.

Step 3 : Đăng ký event và listener trong class EventServiceProvider.

Trong file này chứa một mảng $listen. Với key là event và value là listener.

Step 4 : Kích hoạt sự kiện

Kích hoạt sự kiện với Event facade. Phương thức fire() gọi đối tượng của event class. Như ví dụ sau:

Event::fire(<Event Class Object>);

Ví dụ

Step 1 : Tạo controller CreateStudentController bằng lệnh command sau:

php artisan make:controller CreateStudentController

Step 2 : Thêm code sau vào file controller CreateStudentController vừa tạo.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;
use App\Events\StudentAdded;
use Event;

class CreateStudentController extends Controller
{
    public function insertform(){
        return view('stud_add');
    }

    public function insert(Request $request){
        $name = $request->input('stud_name');
        DB::insert('insert into student (name) values(?)',[$name]);
        echo "Record inserted successfully.<br/>";
        echo '<a href = "/event">Click Here</a> to go back.';

        //firing an event
        Event::fire(new StudentAdded($name));
    }
}

Step 3 : Tạo view stud_add.blade.php với nội dung sau:

resources\views\stud_add.blade.php

<html>
   <body>

    {!! Form::open(['url' => 'addstudent']) !!}

    {{ Form::text('stud_name', null, ['placeholder'=>'name']) }}
    <br />

    {{ Form::submit('Add Student') }}
    {!! Form::close() !!}
   </body>
</html>

Step 4 : Tạo event tên StudentAdded bằng lệnh command sau:

php artisan make:event StudentAdded

Step 5 : Thêm code như bên dưới vào event StudentAdded vừa tạo để truyền biến $user vào Listener.

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class StudentAdded
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $name;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

Step 6 : Tạo Listener tên ListenerNewStudentAdded bằng lệnh bên dưới:

php artisan make:listener ListenerNewStudentAdded  --event=StudentAdded

Step 7 : Thêm code như bên dưới vào Listener ListenerNewStudentAdded vừa tạo.

app\Listeners\ListenerNewStudentAdded.php

<?php

namespace App\Listeners;

use App\Events\StudentAdded;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class ListenerNewStudentAdded
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    protected $name;

    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  StudentAdded  $event
     * @return void
     */
    public function handle(StudentAdded $event)
    {
        $this->name = $event->name;
        echo "<br>New Student added in database with name: ".$this->name;
    }
}

Step 8 : Đăng ký Event và Listener vào EventServiceProvider.

app\Providers\EventServiceProvider.php

protected $listen = [
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],
    'App\Events\StudentAdded' => [
        'App\Listeners\ListenerNewStudentAdded',
     ],
];

Step 9 : Thêm code sau vào routes/web.php.

Route::get('event','CreateStudentController@insertform');
Route::post('addstudent','CreateStudentController@insert');

Step 10 : Vào http://localhost:8000/event để thêm student.

Step 11 : click add student xem kết quả: