LARAVEL TUTORIALS
10 thủ thuật Lavavel giúp bạn code nhanh hơn! Routing trong Laravel, cách tạo Route và sử dung AZ Tạo Middleware trong Laravel đơn giản trong 5 phút Xử lý Authentication và Authorization trong Laravel Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất Tạo broadcast event trong Laravel dễ dàng trong 10 phút Xử lý Form Validation trong Laravel từ A - Z Cách tạo Session và cookie trong Laravel dễ dàng như ăn cháo Top 10 Package Lavavel thường dùng trong dự án Laravel Sử dụng Task trong Laravel đơn giản trong 10 phút. Cách tạo API trong Laravel đơn giản chỉ trong 5 phút Cách tạo job trong Laravel sao cho hiệu quả? Queues trong Laravel, dùng để xử lý các tác vụ mất nhiều thời gian Cache trong Laravel, các loại Cache thường dùng trong Laravel Redis trong Laravel, biết cách sử dung Redis Laravel trong 5 phút Sử dụng Memcache trong Laravel tăng tốc độ truy cập website Unit Test trong Laravel, thực hành tạo testing Laravel A-Z 10 thủ thuật tối ưu quá trình Testing trong Laravel Top 7 thư viện Testing Laravel được dùng nhiều nhất Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng Cách dùng Browser Testing (Laravel Dusk) trong Laravel Cách tạo test case cho Controller trong Laravel Cách tạo test case cho Model trong Laravel Cách tạo Database Testing trong Laravel Real-time web applications là gì ? Tầm quan trọng trong Laravel Laravel WebSockets, các bước tạo WebSockets trong Laravel Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime Cách dùng Long polling trong Laravel để cải thiện trải nghiệm Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ Cách dùng Event Sourcing trong Laravel Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản Sử dụng Service Container trong Laravel dễ dàng Cách xử lý đa ngôn ngữ trong Laravel dễ dàng Tìm hiểu và sử dụng Service Provider trong Laravel Facades là gì? Cách dùng Facades trong Laravel Cách sử dụng Email Verification trong Laravel Cách dùng URL Generation trong Larevel Cách sử dụng Error Handling trong Laravel Cách dùng Encryption và decryption trong Laravel Cách sử dụng Relationships trong Laravel Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows Sử dụng Event trong Laravel Một cách quản lý filter trong Laravel
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Cách dùng Socket.io trong Laravel để xây dựng các ứng dụng thời gian thực như chat, thông báo thời gian thực và các ứng dụng khác.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết này, chúng ta sẽ hướng dẫn cách sử dụng Socket.io trong Laravel để xây dựng các ứng dụng thời gian thực như chat, thông báo thời gian thực và các ứng dụng khác. Chúng ta sẽ tìm hiểu cách cài đặt Socket.io và Laravel WebSockets, cấu hình thông tin cần thiết cho Socket.io trong Laravel, cách xử lý các sự kiện từ client đến server và ngược lại, và cách gửi các sự kiện từ server đến client.

Hãy cùng tìm hiểu chi tiết về cách sử dụng Socket.io trong Laravel và xây dựng các ứng dụng thời gian thực trên nền tảng PHP.

1. Socket.io trong Laravel là gì?

socket iolaravel png

Socket.io trong Laravel

Socket.io là một thư viện JavaScript cho phép giao tiếp hai chiều giữa client và server trong thời gian thực thông qua các sự kiện và tin nhắn. Trong Laravel, chúng ta có thể sử dụng Socket.io để xây dựng các ứng dụng thời gian thực trên nền tảng PHP.

Bài viết này được đăng tại [free tuts .net]

Laravel WebSockets là một package cho phép tạo kết nối websocket giữa client và server để gửi và nhận các tin nhắn trong thời gian thực. Laravel WebSockets sử dụng Socket.io như là một cơ chế để xử lý các sự kiện và tin nhắn giữa client và server.

Với sử dụng Socket.io trong Laravel, chúng ta có thể xây dựng các ứng dụng thời gian thực như chat, thông báo thời gian thực và các ứng dụng khác trên nền tảng PHP một cách dễ dàng và hiệu quả.

2. Tại sao Socket.io được sử dụng trong Laravel?

Socket.io là một thư viện JavaScript cho phép giao tiếp hai chiều giữa client và server trong thời gian thực thông qua các sự kiện và tin nhắn. Trong Laravel, chúng ta có thể sử dụng Socket.io để xây dựng các ứng dụng thời gian thực trên nền tảng PHP.

Socket.io cho phép gửi và nhận các tin nhắn giữa client và server trong thời gian thực, cho phép các ứng dụng thời gian thực như chat, thông báo thời gian thực và các ứng dụng khác được xây dựng trên nền tảng PHP. Nó cũng cho phép client và server giao tiếp với nhau một cách nhanh chóng và hiệu quả, đảm bảo ứng dụng có khả năng mở rộng tốt hơn.

Trong Laravel, chúng ta có thể sử dụng Laravel WebSockets, một package cho phép tạo kết nối websocket giữa client và server để gửi và nhận các tin nhắn trong thời gian thực. Laravel WebSockets sử dụng Socket.io như là một cơ chế để xử lý các sự kiện và tin nhắn giữa client và server. Vì vậy, sử dụng Socket.io trong Laravel giúp cho việc xây dựng các ứng dụng thời gian thực trên nền tảng PHP trở nên dễ dàng và hiệu quả hơn.

3. Cách sử dụng Socket.io trong Laravel

Bước 1: Cài đặt Socket.io

Để sử dụng Socket.io trong Laravel, bạn cần cài đặt các gói cần thiết bằng npm. Bạn có thể sử dụng lệnh sau để cài đặt Socket.io và Redis, một hệ thống lưu trữ key-value để lưu trữ các thông tin về kết nối của client:

npm install --save socket.io ioredis

Bước 2: Cấu hình Laravel để sử dụng Socket.io

Để sử dụng Socket.io trong Laravel, bạn cần cấu hình Laravel để sử dụng Redis làm hệ thống lưu trữ session. Để làm điều này, bạn cần mở file .env và cấu hình các giá trị sau:

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis

Sau khi đã cấu hình, bạn cần tạo một file mới tên là broadcasting.php trong thư mục config của Laravel. File này sẽ chứa các thông tin cấu hình cho kết nối Socket.io và Redis. Bạn có thể sử dụng đoạn mã sau để cấu hình:

return [
    'default' => env('BROADCAST_DRIVER', 'null'),

    'connections' => [
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],
    ],

    'redis' => [
        'client' => 'predis',
        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
        ],
    ],
];

Bước 3: Tạo route cho Socket.io

Sau khi đã cài đặt và cấu hình được Socket.io và Redis, bạn cần tạo route cho Socket.io trong Laravel để có thể kết nối tới server Socket.io từ client.

Trong file routes/web.php, bạn có thể tạo một route cho Socket.io bằng cách sử dụng hàm Route::get() hoặc Route::post(), nhưng để tránh xung đột với các route khác của ứng dụng, tốt nhất là nên sử dụng hàm Route::prefix() để tạo một route prefix cho Socket.io.

Ví dụ, để tạo một route prefix socket.io cho Socket.io, bạn có thể sử dụng đoạn mã sau:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;

Route::prefix('socket.io')->group(function () {
    Route::any('/{any}', function (Request $request, $any) {
        $http_origin = $request->header('Origin');
        $allowed_origins = explode(',', env('SOCKET_ALLOWED_ORIGINS'));

        if (in_array($http_origin, $allowed_origins)) {
            $http_host = $request->getHttpHost();

            $redis_client = Redis::connection();
            $redis_client->publish('socket-io-event', json_encode([
                'host' => $http_host,
                'path' => $request->getPathInfo(),
                'body' => $request->getContent(),
            ]));

            return response()->stream(function () use ($redis_client, $http_host, $any) {
                $redis_subscriber = $redis_client->subscribe(['socket-io-response-' . $http_host . '-' . $any]);

                foreach ($redis_subscriber as $message) {
                    if ($message->kind === 'message') {
                        echo $message->payload;
                    }
                }
            });
        } else {
            abort(403, 'Forbidden');
        }
    })->where('any', '.*');
});

Trong đoạn mã trên, chúng ta đã sử dụng hàm Route::prefix() để tạo một route prefix socket.io cho Socket.io. Sau đó, chúng ta đã sử dụng hàm Route::any() để định nghĩa một route động cho tất cả các phương thức HTTP.

Trong hàm callback của route, chúng ta đã lấy header Origin của request và kiểm tra xem nó có nằm trong danh sách các domain được phép kết nối tới server Socket.io hay không. Nếu không, chúng ta sẽ trả về mã lỗi 403.

Nếu domain của client được phép kết nối tới server Socket.io, chúng ta sẽ lấy host và path của request, cùng với body của request và gửi chúng tới Redis. Sau đó, chúng ta sẽ trả về một response stream, sử dụng hàm response()->stream() của Laravel. Trong callback của response stream, chúng ta sẽ đăng ký một Redis subscriber và lặp lại cho đến khi có kết quả trả về từ Redis subscriber. Kết quả này sẽ được trả về cho client

Bước 4: Xử lý các sự kiện

Sau khi đã tạo route cho Socket.io, bạn có thể xử lý các sự kiện realtime trong Laravel bằng cách sử dụng Laravel Echo.

Đầu tiên, bạn cần cài đặt Laravel Echo thông qua Composer:

composer require laravel/echo

Sau đó, bạn cần cấu hình Laravel Echo trong file resources/js/bootstrap.js bằng cách thêm đoạn mã sau:

import Echo from 'laravel-echo';

window.io = require('socket.io-client');

if (typeof io !== 'undefined') {
    window.Echo = new Echo({
        broadcaster: 'socket.io',
        host: window.location.hostname + ':6001',
    });
}

Trong đoạn mã trên, chúng ta đã import module laravel-echo socket.io-client, và thiết lập các thông số cho Echo object.

Sau khi đã cấu hình Laravel Echo, bạn có thể sử dụng nó để xử lý các sự kiện realtime. Ví dụ, để lắng nghe sự kiện test-event từ server Socket.io, bạn có thể sử dụng đoạn mã sau:

Echo.channel('test-channel')
    .listen('test-event', (data) => {
        console.log(data);
    });

Trong đoạn mã trên, chúng ta đã sử dụng hàm channel() của Laravel Echo để đăng ký kênh test-channel, và sử dụng hàm listen() để lắng nghe sự kiện test-event trên kênh đó. Khi có sự kiện test-event được phát tới từ server Socket.io, callback của hàm listen() sẽ được gọi và nhận vào tham số data.

Bạn cũng có thể sử dụng Laravel Echo để gửi các sự kiện realtime tới server Socket.io. Ví dụ, để gửi sự kiện test-event tới server Socket.io, bạn có thể sử dụng đoạn mã sau:

Echo.channel('test-channel')
    .whisper('test-event', { message: 'Hello, world!' });

Trong đoạn mã trên, chúng ta đã sử dụng hàm whisper() của Laravel Echo để gửi sự kiện test-event tới server Socket.io trên kênh test-channel, và truyền vào đối tượng { message: 'Hello, world!' } làm dữ liệu của sự kiện.

Bước 5: Phát tán các sự kiện realtime từ Laravel

Sau khi đã xử lý các sự kiện realtime từ client, bạn có thể phát tán các sự kiện realtime từ Laravel bằng cách sử dụng các chức năng được cung cấp bởi Laravel Echo.

Để phát tán một sự kiện realtime từ Laravel, bạn cần sử dụng hàm event() của Laravel Echo. Ví dụ, để phát tán sự kiện test-event tới các client đang lắng nghe trên kênh test-channel, bạn có thể sử dụng đoạn mã sau:

use App\Events\TestEvent;
use Illuminate\Support\Facades\Event;

Route::get('/test', function () {
    $data = ['message' => 'Hello, world!'];

    Event::dispatch(new TestEvent($data));

    return view('test');
});

Trong đoạn mã trên, chúng ta đã sử dụng hàm dispatch() của Event facade để phát tán một instance của class TestEvent. Class TestEvent sẽ được định nghĩa như sau:

namespace App\Events;

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

class TestEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function broadcastOn()
    {
        return new Channel('test-channel');
    }

    public function broadcastAs()
    {
        return 'test-event';
    }
}

Trong class TestEvent, chúng ta đã implement interface ShouldBroadcast để chỉ ra rằng class này là một sự kiện cần phát tán realtime. Bên cạnh đó, chúng ta cũng đã định nghĩa các phương thức broadcastOn()broadcastAs() để xác định kênh và tên của sự kiện cần phát tán.

Sau khi đã phát tán sự kiện TestEvent từ Laravel, các client đang lắng nghe sự kiện test-event trên kênh test-channel sẽ nhận được sự kiện này thông qua Laravel Echo.

Bước 6: Nhận các sự kiện realtime từ Laravel

Sau khi đã phát tán các sự kiện realtime từ Laravel, bạn cần cung cấp các client cách để nhận các sự kiện này. Để nhận các sự kiện realtime từ Laravel, bạn cần đăng ký các listener bằng cách sử dụng Laravel Echo.

Ví dụ, để đăng ký một listener để lắng nghe sự kiện test-event trên kênh test-channel, bạn có thể sử dụng đoạn mã sau trong script của trang web:

Echo.channel('test-channel')
    .listen('test-event', (event) => {
        console.log(event);
    });

Trong đoạn mã trên, chúng ta đã sử dụng hàm channel() của Laravel Echo để đăng ký kênh test-channel. Sau đó, chúng ta sử dụng hàm listen() để đăng ký một listener để lắng nghe sự kiện test-event. Khi có một sự kiện test-event được phát tán trên kênh test-channel, listener này sẽ được kích hoạt và truyền đối tượng sự kiện vào hàm callback để xử lý.

Bước 7: Khởi chạy Laravel Echo

Cuối cùng, bạn cần khởi chạy Laravel Echo để nó có thể kết nối với server và bắt đầu lắng nghe các sự kiện realtime.

Để khởi chạy Laravel Echo, bạn có thể sử dụng đoạn mã sau trong script của trang web:

import Echo from 'laravel-echo';

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001',
});

Trong đoạn mã trên, chúng ta đã import class Echo từ thư viện laravel-echo, sau đó khởi tạo một instance của class Echo với các thông số cấu hình. Trong ví dụ này, chúng ta đã sử dụng driver socket.io và địa chỉ host là localhost:6001. Tùy thuộc vào cấu hình của server của bạn, bạn có thể cần thay đổi các thông số này để phù hợp với môi trường của mình.

Khi đã khởi chạy Laravel Echo, bạn đã hoàn tất các bước để sử dụng Socket.io trong Laravel để phát tán và nhận các sự kiện realtime.

Câu hỏi về Socket.io trong Laravel

Làm thế nào để tương tác với cổng truyền thông khác nhau bằng Socket.io trong Laravel?

Để tương tác với các cổng truyền thông khác nhau bằng Socket.io trong Laravel, bạn cần cài đặt và sử dụng các adapter tương ứng với từng cổng. Ví dụ, nếu bạn muốn tương tác với cổng Redis, bạn cần cài đặt Redis adapter. Sau khi cài đặt, bạn có thể thiết lập adapter trong file cấu hình của Laravel.

Làm thế nào để xử lý lỗi khi sử dụng Socket.io trong Laravel?

Khi sử dụng Socket.io trong Laravel, bạn có thể sử dụng các phương thức xử lý lỗi có sẵn để xử lý các lỗi liên quan đến kết nối, gửi hoặc nhận dữ liệu. Bạn cũng có thể đưa ra thông báo lỗi cho người dùng để họ biết được những lỗi xảy ra.

Có thể sử dụng Socket.io với các ngôn ngữ lập trình khác như Node.js hay không?

Socket.io là một thư viện JavaScript, do đó nó có thể được sử dụng với các ngôn ngữ lập trình khác như Node.js.

Làm thế nào để tích hợp Socket.io với các công nghệ khác trong Laravel, chẳng hạn như Vue.js hay React?

Để tích hợp Socket.io với các công nghệ khác trong Laravel, bạn cần sử dụng các thư viện hoặc plugin có sẵn để hỗ trợ việc tích hợp. Ví dụ, nếu bạn muốn tích hợp Socket.io với Vue.js, bạn có thể sử dụng thư viện vue-socket.io.

Có cần phải sử dụng thư viện bên ngoài để sử dụng Socket.io trong Laravel không?

Không, bạn không cần phải sử dụng thư viện bên ngoài để sử dụng Socket.io trong Laravel. Laravel đã tích hợp sẵn Socket.io và cung cấp cho bạn các phương thức và cấu hình để sử dụng nó. Tuy nhiên, bạn có thể sử dụng các thư viện bên ngoài để hỗ trợ việc tích hợp hoặc tăng cường tính năng của Socket.io.

Kết bài viết

Trên đây là những kiến thức cơ bản về cách sử dụng Socket.io trong Laravel. Sử dụng Socket.io có thể giúp cho ứng dụng của bạn trở nên thời gian thực và tăng tính tương tác giữa người dùng.

Nếu bạn đang tìm kiếm một cách để nâng cao khả năng tương tác của ứng dụng web của mình, hãy thử sử dụng Socket.io với Laravel.

Tuy nhiên, cần lưu ý rằng việc sử dụng Socket.io không phải là giải pháp cho tất cả các trường hợp, và bạn cần phải đánh giá xem liệu nó có phù hợp với nhu cầu của ứng dụng của bạn hay không.

Chúc bạn thành công!

Cùng chuyên mục:

Cách sử dụng Relationships trong Laravel

Cách sử dụng Relationships trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách dùng URL Generation trong Larevel

Cách dùng URL Generation trong Larevel

Cách sử dụng Email Verification trong Laravel

Cách sử dụng Email Verification trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Sử dụng Service Container trong Laravel dễ dàng

Sử dụng Service Container trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách dùng Event Sourcing trong Laravel

Cách dùng Event Sourcing trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Real-time web applications là gì ? Tầm quan trọng  trong Laravel

Real-time web applications là gì ? Tầm quan trọng trong Laravel

Cách tạo Database Testing trong Laravel

Cách tạo Database Testing trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Top