Laravel: Broadcasting

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

 

Giới thiệu

Trong nhiều ứng dụng web hiện đại, WebSockets được sử dụng để triển khai các giao diện người dùng cập nhật trực tiếp, theo thời gian thực. Khi một số dữ liệu được cập nhật trên máy chủ, thông báo thường được gửi qua kết nối WebSocket để máy khách xử lý. WebSockets cung cấp một giải pháp thay thế hiệu quả hơn để liên tục thăm dò máy chủ ứng dụng của bạn để biết các thay đổi dữ liệu sẽ được phản ánh trong giao diện người dùng của bạn.

Ví dụ: hãy tưởng tượng ứng dụng của bạn có thể xuất dữ liệu của người dùng sang tệp CSV và gửi qua email cho họ. Tuy nhiên, việc tạo tệp CSV này mất vài phút nên bạn chọn tạo và gửi CSV qua thư trong một công việc đã được xếp hàng đợi . Khi CSV đã được tạo và gửi tới người dùng, chúng tôi có thể sử dụng tính năng phát sóng sự kiện để gửi một App\Events\UserDataExportedsự kiện được nhận bằng JavaScript của ứng dụng của chúng tôi. Khi sự kiện được nhận, chúng tôi có thể hiển thị thông báo cho người dùng rằng CSV của họ đã được gửi qua email cho họ mà họ không cần phải làm mới trang.

Để hỗ trợ bạn trong việc xây dựng các loại tính năng này, Laravel giúp bạn dễ dàng "phát" các sự kiện Laravel phía máy chủ của bạn qua kết nối WebSocket. Việc phát các sự kiện Laravel của bạn cho phép bạn chia sẻ cùng một tên sự kiện và dữ liệu giữa ứng dụng Laravel phía máy chủ và ứng dụng JavaScript phía máy khách của bạn.

Các khái niệm cốt lõi đằng sau việc phát sóng rất đơn giản: máy khách kết nối với các kênh được đặt tên trên giao diện người dùng, trong khi ứng dụng Laravel của bạn truyền phát các sự kiện đến các kênh này trên phần phụ trợ. Những sự kiện này có thể chứa bất kỳ dữ liệu bổ sung nào bạn muốn cung cấp cho giao diện người dùng.

 

Trình điều khiển được hỗ trợ

Theo mặc định, Laravel bao gồm hai trình điều khiển phát sóng phía máy chủ để bạn lựa chọn: Kênh Pusher và Ably . Tuy nhiên, các gói do cộng đồng điều khiển như laravel-websockets cung cấp trình điều khiển phát sóng bổ sung mà không yêu cầu nhà cung cấp phát sóng thương mại.

 

Trước khi đi sâu vào phát sóng sự kiện, hãy đảm bảo rằng bạn đã đọc tài liệu của Laravel về sự kiện và trình nghe .

 

 

Cài đặt phía máy chủ

Để bắt đầu sử dụng phát sóng sự kiện của Laravel, chúng ta cần thực hiện một số cấu hình trong ứng dụng Laravel cũng như cài đặt một vài gói.

Quá trình phát sóng sự kiện được thực hiện bởi trình điều khiển phát sóng phía máy chủ phát các sự kiện Laravel của bạn để Laravel Echo (một thư viện JavaScript) có thể nhận chúng trong ứng dụng khách trình duyệt. Đừng lo lắng - chúng tôi sẽ hướng dẫn từng bước từng phần của quá trình cài đặt.

 

Cấu hình

Tất cả cấu hình phát sóng sự kiện của ứng dụng của bạn được lưu trữ trong config/broadcasting.phptệp cấu hình. Laravel hỗ trợ một số trình điều khiển quảng bá: Kênh Pusher , Redis và logtrình điều khiển để phát triển cục bộ và gỡ lỗi. Ngoài ra, một nulltrình điều khiển được bao gồm cho phép bạn tắt hoàn toàn tính năng phát sóng trong quá trình thử nghiệm. Một ví dụ cấu hình được bao gồm cho mỗi trình điều khiển này trong config/broadcasting.phptệp cấu hình.

 

Nhà cung cấp dịch vụ phát sóng

Trước khi phát sóng bất kỳ sự kiện nào, trước tiên bạn sẽ cần đăng ký App\Providers\BroadcastServiceProvider. Trong các ứng dụng Laravel mới, bạn chỉ cần bỏ ghi chú nhà cung cấp này trong providersmảng config/app.phptệp cấu hình của mình . Điều này BroadcastServiceProviderchứa mã cần thiết để đăng ký các tuyến đường ủy quyền quảng bá và các cuộc gọi lại.

 

Cấu hình hàng đợi

Bạn cũng cần phải cấu hình và chạy một queue worker . Tất cả việc phát sóng sự kiện được thực hiện thông qua các công việc được xếp hàng để thời gian phản hồi của ứng dụng của bạn không bị ảnh hưởng nghiêm trọng bởi các sự kiện đang được phát sóng.

 

Kênh đẩy

Nếu bạn định phát các sự kiện của mình bằng cách sử dụng Pusher Channels , bạn nên cài đặt SDK PHP của Pusher Channels bằng cách sử dụng trình quản lý gói Composer:

composer require pusher/pusher-php-server

Tiếp theo, bạn nên định cấu hình thông tin đăng nhập Kênh Pusher của mình trong config/broadcasting.phptệp cấu hình. Một cấu hình Pusher Channels mẫu đã được bao gồm trong tệp này, cho phép bạn nhanh chóng chỉ định khóa, bí mật và ID ứng dụng của mình. Thông thường, những giá trị này nên được thiết lập thông qua PUSHER_APP_KEYPUSHER_APP_SECRETvà PUSHER_APP_ID các biến môi trường :

PUSHER_APP_ID=your-pusher-app-id
PUSHER_APP_KEY=your-pusher-key
PUSHER_APP_SECRET=your-pusher-secret
PUSHER_APP_CLUSTER=mt1

Các config/broadcasting.phpcủa tập tin pushercấu hình cũng cho phép bạn chỉ định thêm optionsđược hỗ trợ bởi kênh, chẳng hạn như cluster.

Tiếp theo, bạn sẽ cần thay đổi trình điều khiển chương trình phát sóng của mình thành pushertrong .envtệp của mình :

BROADCAST_DRIVER=pusher

Cuối cùng, bạn đã sẵn sàng cài đặt và cấu hình Laravel Echo , nó sẽ nhận các sự kiện truyền phát ở phía máy khách.

 

Pusher tương thích với Laravel Websockets

Gói laravel-websockets là một gói WebSocket tương thích với PHP, Pusher cho Laravel. Gói này cho phép bạn tận dụng toàn bộ sức mạnh của việc phát sóng Laravel mà không cần nhà cung cấp WebSocket thương mại. Để biết thêm thông tin về cách cài đặt và sử dụng gói này, vui lòng tham khảo tài liệu chính thức của nó .

 

Ably

Nếu bạn định phát các sự kiện của mình bằng Ably , bạn nên cài đặt Ably PHP SDK bằng trình quản lý gói Composer:

composer require ably/ably-php

Tiếp theo, bạn nên định cấu hình thông tin đăng nhập Ably của mình trong config/broadcasting.phptệp cấu hình. Một cấu hình Ably ví dụ đã được bao gồm trong tệp này, cho phép bạn nhanh chóng chỉ định khóa của mình. Thông thường, giá trị này phải được đặt thông qua ABLY_KEY biến môi trường :

ABLY_KEY=your-ably-key

Tiếp theo, bạn sẽ cần thay đổi trình điều khiển chương trình phát sóng của mình thành ablytrong .envtệp của mình :

BROADCAST_DRIVER=ably

Cuối cùng, bạn đã sẵn sàng cài đặt và cấu hình Laravel Echo , nó sẽ nhận các sự kiện truyền phát ở phía máy khách.

 

Các giải pháp thay thế nguồn mở

Gói laravel-websockets là một gói WebSocket tương thích với PHP, Pusher cho Laravel. Gói này cho phép bạn tận dụng toàn bộ sức mạnh của việc phát sóng Laravel mà không cần nhà cung cấp WebSocket thương mại. Để biết thêm thông tin về cách cài đặt và sử dụng gói này, vui lòng tham khảo tài liệu chính thức của nó .

 

Cài đặt phía máy khách

 

Kênh đẩy

Laravel Echo là một thư viện JavaScript giúp đăng ký kênh và nghe các sự kiện được phát bởi trình điều khiển phát phía máy chủ của bạn một cách dễ dàng. Bạn có thể cài đặt Echo thông qua trình quản lý gói NPM. Trong ví dụ này, chúng tôi cũng sẽ cài đặt pusher-jsgói vì chúng tôi sẽ sử dụng đài truyền hình Pusher Channels:

npm install --save-dev laravel-echo pusher-js

Sau khi Echo được cài đặt, bạn đã sẵn sàng tạo một phiên bản Echo mới trong JavaScript của ứng dụng của mình. Một nơi tuyệt vời để thực hiện việc này là ở cuối resources/js/bootstrap.jstệp được bao gồm trong khuôn khổ Laravel. Theo mặc định, một cấu hình Echo mẫu đã được bao gồm trong tệp này - bạn chỉ cần bỏ ghi chú nó:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    forceTLS: true
});

Khi bạn đã bỏ ghi chú và điều chỉnh cấu hình Echo theo nhu cầu của mình, bạn có thể biên dịch nội dung ứng dụng của mình:

npm run dev

 

Để tìm hiểu thêm về cách biên dịch nội dung JavaScript của ứng dụng của bạn, vui lòng tham khảo tài liệu về Laravel Mix .

 

 

Sử dụng Phiên bản Khách hàng Hiện tại

Nếu bạn đã có phiên bản ứng dụng Pusher Channels được cấu hình sẵn mà bạn muốn Echo sử dụng, bạn có thể chuyển nó cho Echo thông qua clienttùy chọn cấu hình:

import Echo from 'laravel-echo';

const client = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key',
    client: client
});

 

Ably

Laravel Echo là một thư viện JavaScript giúp đăng ký kênh và nghe các sự kiện được phát bởi trình điều khiển phát phía máy chủ của bạn một cách dễ dàng. Bạn có thể cài đặt Echo thông qua trình quản lý gói NPM. Trong ví dụ này, chúng tôi cũng sẽ cài đặt pusher-jsgói.

Bạn có thể thắc mắc tại sao chúng tôi cài đặt pusher-jsthư viện JavaScript mặc dù chúng tôi đang sử dụng Ably để phát các sự kiện của mình. Rất may, Ably bao gồm chế độ tương thích với Pusher cho phép chúng tôi sử dụng giao thức Pusher khi lắng nghe các sự kiện trong ứng dụng phía máy khách của chúng tôi:

npm install --save-dev laravel-echo pusher-js

Trước khi tiếp tục, bạn nên bật hỗ trợ giao thức Pusher trong cài đặt ứng dụng Ably của mình. Bạn có thể bật tính năng này trong phần "Cài đặt Bộ điều hợp Giao thức" của bảng điều khiển cài đặt của ứng dụng Ably.

Sau khi Echo được cài đặt, bạn đã sẵn sàng tạo một phiên bản Echo mới trong JavaScript của ứng dụng của mình. Một nơi tuyệt vời để thực hiện việc này là ở cuối resources/js/bootstrap.jstệp được bao gồm trong khuôn khổ Laravel. Theo mặc định, một cấu hình Echo mẫu đã được bao gồm trong tệp này; tuy nhiên, cấu hình mặc định trong bootstrap.jstệp là dành cho Pusher. Bạn có thể sao chép cấu hình bên dưới để chuyển đổi cấu hình của mình sang Ably:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_ABLY_PUBLIC_KEY,
    wsHost: 'realtime-pusher.ably.io',
    wsPort: 443,
    disableStats: true,
    encrypted: true,
});

Lưu ý rằng cấu hình Ably Echo của chúng tôi tham chiếu đến một MIX_ABLY_PUBLIC_KEYbiến môi trường. Giá trị của biến này phải là khóa công khai Ably của bạn. Khóa công khai của bạn là một phần của khóa Ably xuất hiện trước :ký tự.

Khi bạn đã bỏ ghi chú và điều chỉnh cấu hình Echo theo nhu cầu của mình, bạn có thể biên dịch nội dung ứng dụng của mình:

npm run dev

 

Để tìm hiểu thêm về cách biên dịch nội dung JavaScript của ứng dụng của bạn, vui lòng tham khảo tài liệu về Laravel Mix .

 

 

Tổng quan về khái niệm

Việc phát sóng sự kiện của Laravel cho phép bạn truyền phát các sự kiện Laravel phía máy chủ của mình tới ứng dụng JavaScript phía máy khách của bạn bằng cách sử dụng cách tiếp cận dựa trên trình điều khiển đối với WebSockets. Hiện tại, Laravel giao hàng với Pusher Channels và trình điều khiển Ably . Có thể dễ dàng sử dụng các sự kiện ở phía máy khách bằng cách sử dụng gói JavaScript Laravel Echo .

Sự kiện được phát qua "kênh", có thể được chỉ định là công khai hoặc riêng tư. Bất kỳ khách truy cập nào vào ứng dụng của bạn đều có thể đăng ký kênh công khai mà không cần bất kỳ xác thực hoặc ủy quyền nào; tuy nhiên, để đăng ký một kênh riêng tư, người dùng phải được xác thực và ủy quyền để nghe trên kênh đó.

 

Nếu bạn muốn sử dụng một mã nguồn mở, thay thế dựa trên PHP cho Pusher, hãy xem gói laravel-websockets .

 

 

Sử dụng một ứng dụng mẫu

Trước khi đi sâu vào từng thành phần của phát sóng sự kiện, chúng ta hãy xem tổng quan cấp cao bằng cách sử dụng cửa hàng thương mại điện tử làm ví dụ.

Trong ứng dụng của chúng tôi, giả sử chúng tôi có một trang cho phép người dùng xem trạng thái giao hàng cho các đơn đặt hàng của họ. Cũng giả sử rằng một OrderShipmentStatusUpdatedsự kiện được kích hoạt khi ứng dụng xử lý cập nhật trạng thái vận chuyển:

use App\Events\OrderShipmentStatusUpdated;

OrderShipmentStatusUpdated::dispatch($order);

 

các ShouldBroadcastgiao diện

Khi người dùng đang xem một trong các đơn đặt hàng của họ, chúng tôi không muốn họ phải làm mới trang để xem cập nhật trạng thái. Thay vào đó, chúng tôi muốn phát các bản cập nhật cho ứng dụng khi chúng được tạo. Vì vậy, chúng ta cần đánh dấu OrderShipmentStatusUpdatedsự kiện bằng ShouldBroadcastgiao diện. Điều này sẽ hướng dẫn Laravel phát sự kiện khi nó được kích hoạt:

<?php

namespace App\Events;

use App\Order;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class OrderShipmentStatusUpdated implements ShouldBroadcast
{
    /**
     * The order instance.
     *
     * @var \App\Order
     */
    public $order;
}

Các ShouldBroadcastgiao diện đòi hỏi sự kiện của chúng tôi để xác định một broadcastOnphương pháp. Phương thức này có trách nhiệm trả về các kênh mà sự kiện sẽ phát trên đó. Phần sơ khai trống của phương thức này đã được định nghĩa trên các lớp sự kiện được tạo, vì vậy chúng ta chỉ cần điền thông tin chi tiết của nó. Chúng tôi chỉ muốn người tạo đơn đặt hàng có thể xem cập nhật trạng thái, vì vậy, chúng tôi sẽ phát sự kiện trên một kênh riêng được liên kết với đơn đặt hàng:

/**
 * Get the channels the event should broadcast on.
 *
 * @return \Illuminate\Broadcasting\PrivateChannel
 */
public function broadcastOn()
{
    return new PrivateChannel('orders.'.$this->order->id);
}

 

Cấp phép kênh

Hãy nhớ rằng người dùng phải được phép nghe trên các kênh riêng tư. Chúng tôi có thể xác định các quy tắc ủy quyền kênh của mình trong hồ sơ đăng ký của chúng tôi routes/channels.php. Trong ví dụ này, chúng tôi cần xác minh rằng bất kỳ người dùng nào cố gắng nghe trên order.1kênh riêng tư thực sự là người tạo ra lệnh:

use App\Models\Order;

Broadcast::channel('orders.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

Các channelphương pháp chấp nhận hai đối số: tên của kênh và một callback mà lợi nhuận truehoặc falsechỉ ra cho dù người dùng được ủy quyền để lắng nghe trên kênh.

Tất cả các lệnh gọi lại ủy quyền nhận người dùng hiện đã được xác thực làm đối số đầu tiên của họ và bất kỳ tham số ký tự đại diện bổ sung nào làm đối số tiếp theo của họ. Trong ví dụ này, chúng tôi đang sử dụng {orderId}trình giữ chỗ để cho biết rằng phần "ID" của tên kênh là ký tự đại diện.

 

Nghe các chương trình phát sóng sự kiện

Tiếp theo, tất cả những gì còn lại là lắng nghe sự kiện trong ứng dụng JavaScript của chúng tôi. Chúng ta có thể làm điều này bằng cách sử dụng Laravel Echo. Đầu tiên, chúng tôi sẽ sử dụng privatephương pháp để đăng ký kênh riêng tư. Sau đó, chúng tôi có thể sử dụng listenphương pháp để lắng nghe OrderShipmentStatusUpdatedsự kiện. Theo mặc định, tất cả các thuộc tính công khai của sự kiện sẽ được đưa vào sự kiện phát sóng:

Echo.private(`orders.${orderId}`)
    .listen('OrderShipmentStatusUpdated', (e) => {
        console.log(e.order);
    });

 

Xác định sự kiện phát sóng

Để thông báo cho Laravel rằng một sự kiện nhất định sẽ được phát sóng, bạn phải triển khai Illuminate\Contracts\Broadcasting\ShouldBroadcastgiao diện trên lớp sự kiện. Giao diện này đã được nhập vào tất cả các lớp sự kiện do khuôn khổ tạo ra, vì vậy bạn có thể dễ dàng thêm nó vào bất kỳ sự kiện nào của mình.

Các ShouldBroadcastgiao diện đòi hỏi bạn phải thực hiện một phương pháp duy nhất: broadcastOn. Các broadcastOnphương pháp phải trả lại một kênh hoặc sắp xếp các kênh mà sự kiện này nên được phát sóng trên. Các kênh nên các trường hợp ChannelPrivateChannelhoặc PresenceChannel. Các trường hợp Channelđại diện cho các kênh công khai mà bất kỳ người dùng nào cũng có thể đăng ký, trong khi PrivateChannelsvà PresenceChannelsđại diện cho các kênh riêng tư yêu cầu ủy quyền kênh :

<?php

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class ServerCreated implements ShouldBroadcast
{
    use SerializesModels;

    /**
     * The user that created the server.
     *
     * @var \App\Models\User
     */
    public $user;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('user.'.$this->user->id);
    }
}

Sau khi thực hiện ShouldBroadcastgiao diện, bạn chỉ cần kích hoạt sự kiện như bình thường. Khi sự kiện đã được kích hoạt, một công việc được xếp hàng đợi sẽ tự động phát sự kiện bằng cách sử dụng trình điều khiển phát sóng được chỉ định của bạn.

 

Tên chương trình phát sóng

Theo mặc định, Laravel sẽ phát sự kiện bằng cách sử dụng tên lớp của sự kiện. Tuy nhiên, bạn có thể tùy chỉnh tên chương trình phát sóng bằng cách xác định một broadcastAsphương thức trên sự kiện:

/**
 * The event's broadcast name.
 *
 * @return string
 */
public function broadcastAs()
{
    return 'server.created';
}

Nếu bạn tùy chỉnh tên chương trình phát sóng bằng broadcastAsphương pháp này, bạn nên đảm bảo đăng ký người nghe của mình bằng .ký tự đứng đầu . Điều này sẽ hướng dẫn Echo không thêm không gian tên của ứng dụng vào sự kiện:

.listen('.server.created', function (e) {
    ....
});

 

Dữ liệu truyền phát

Khi một sự kiện được phát sóng, tất cả các publicthuộc tính của sự kiện đó sẽ tự động được tuần tự hóa và phát sóng dưới dạng tải trọng của sự kiện, cho phép bạn truy cập bất kỳ dữ liệu công khai nào của sự kiện đó từ ứng dụng JavaScript của bạn. Vì vậy, ví dụ: nếu sự kiện của bạn có một thuộc tính công cộng $userchứa mô hình Eloquent, trọng tải phát sóng của sự kiện sẽ là:

{
    "user": {
        "id": 1,
        "name": "Patrick Stewart"
        ...
    }
}

Tuy nhiên, nếu bạn muốn có nhiều quyền kiểm soát chi tiết hơn đối với tải trọng truyền phát của mình, bạn có thể thêm một broadcastWithphương thức vào sự kiện của mình. Phương thức này sẽ trả về mảng dữ liệu mà bạn muốn phát dưới dạng trọng tải sự kiện:

/**
 * Get the data to broadcast.
 *
 * @return array
 */
public function broadcastWith()
{
    return ['id' => $this->user->id];
}

 

Hàng đợi phát sóng

Theo mặc định, mỗi sự kiện truyền phát được đặt trên hàng đợi mặc định cho kết nối hàng đợi mặc định được chỉ định trong queue.phptệp cấu hình của bạn . Bạn có thể tùy chỉnh kết nối hàng đợi và tên được đài truyền hình sử dụng bằng cách xác định connectionvà queuethuộc tính trên lớp sự kiện của bạn:

/**
 * The name of the queue connection to use when broadcasting the event.
 *
 * @var string
 */
public $connection = 'redis';

/**
 * The name of the queue on which to place the broadcasting job.
 *
 * @var string
 */
public $queue = 'default';

Nếu bạn muốn truyền phát sự kiện của mình bằng cách sử dụng synchàng đợi thay vì trình điều khiển hàng đợi mặc định, bạn có thể triển khai ShouldBroadcastNowgiao diện thay vì ShouldBroadcast:

<?php

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class OrderShipmentStatusUpdated implements ShouldBroadcastNow
{
    //
}

 

Điều kiện phát sóng

Đôi khi bạn chỉ muốn phát sự kiện của mình nếu một điều kiện nhất định là đúng. Bạn có thể xác định các điều kiện này bằng cách thêm một broadcastWhenphương thức vào lớp sự kiện của mình:

/**
 * Determine if this event should broadcast.
 *
 * @return bool
 */
public function broadcastWhen()
{
    return $this->order->value > 100;
}

 

Truyền phát & giao dịch cơ sở dữ liệu

Khi các sự kiện quảng bá được gửi đi trong các giao dịch cơ sở dữ liệu, chúng có thể được hàng đợi xử lý trước khi giao dịch cơ sở dữ liệu được cam kết. Khi điều này xảy ra, bất kỳ cập nhật nào bạn đã thực hiện cho các mô hình hoặc bản ghi cơ sở dữ liệu trong quá trình giao dịch cơ sở dữ liệu có thể chưa được phản ánh trong cơ sở dữ liệu. Ngoài ra, bất kỳ mô hình hoặc bản ghi cơ sở dữ liệu nào được tạo trong giao dịch có thể không tồn tại trong cơ sở dữ liệu. Nếu sự kiện của bạn phụ thuộc vào các mô hình này, các lỗi không mong muốn có thể xảy ra khi công việc phát sự kiện được xử lý.

Nếu after_committùy chọn cấu hình của kết nối hàng đợi của bạn được đặt thành false, bạn vẫn có thể chỉ ra rằng một sự kiện truyền phát cụ thể sẽ được gửi đi sau khi tất cả các giao dịch cơ sở dữ liệu mở đã được cam kết bằng cách xác định một thuộc $afterCommittính trên lớp sự kiện:

<?php

namespace App\Events;

use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class ServerCreated implements ShouldBroadcast
{
    use SerializesModels;

    public $afterCommit = true;
}

 

Để tìm hiểu thêm về cách giải quyết những vấn đề này, vui lòng xem lại tài liệu liên quan đến các công việc được xếp hàng đợi và giao dịch cơ sở dữ liệu .

 

 

Cấp phép kênh

Các kênh riêng tư yêu cầu bạn cho phép để người dùng hiện đã được xác thực thực sự có thể nghe trên kênh. Điều này được thực hiện bằng cách thực hiện một yêu cầu HTTP đến ứng dụng Laravel của bạn với tên kênh và cho phép ứng dụng của bạn xác định xem người dùng có thể nghe trên kênh đó hay không. Khi sử dụng Laravel Echo , yêu cầu HTTP cấp phép đăng ký cho các kênh riêng tư sẽ được thực hiện tự động; tuy nhiên, bạn cần xác định các tuyến thích hợp để đáp ứng các yêu cầu này.

 

Xác định các tuyến đường ủy quyền

Rất may, Laravel giúp dễ dàng xác định các tuyến để phản hồi các yêu cầu cấp quyền kênh. Trong App\Providers\BroadcastServiceProviderứng dụng Laravel đi kèm, bạn sẽ thấy một lệnh gọi đến Broadcast::routesphương thức. Phương thức này sẽ đăng ký /broadcasting/authtuyến đường để xử lý các yêu cầu ủy quyền:

Broadcast::routes();

Các Broadcast::routesphương pháp sẽ tự động đặt các tuyến đường của mình trong webnhóm trung gian; tuy nhiên, bạn có thể chuyển một mảng các thuộc tính tuyến đường cho phương thức nếu bạn muốn tùy chỉnh các thuộc tính được chỉ định:

Broadcast::routes($attributes);

 

Tùy chỉnh Điểm cuối Cấp phép

Theo mặc định, Echo sẽ sử dụng /broadcasting/authđiểm cuối để cấp quyền truy cập kênh. Tuy nhiên, bạn có thể chỉ định điểm cuối ủy quyền của riêng mình bằng cách chuyển authEndpointtùy chọn cấu hình cho phiên bản Echo của bạn:

window.Echo = new Echo({
    broadcaster: 'pusher',
    // ...
    authEndpoint: '/custom/endpoint/auth'
});

 

Tùy chỉnh Yêu cầu Ủy quyền

Bạn có thể tùy chỉnh cách Laravel Echo thực hiện các yêu cầu ủy quyền bằng cách cung cấp trình ủy quyền tùy chỉnh khi khởi tạo Echo:

window.Echo = new Echo({
    // ...
    authorizer: (channel, options) => {
        return {
            authorize: (socketId, callback) => {
                axios.post('/api/broadcasting/auth', {
                    socket_id: socketId,
                    channel_name: channel.name
                })
                .then(response => {
                    callback(false, response.data);
                })
                .catch(error => {
                    callback(true, error);
                });
            }
        };
    },
})

 

Xác định lệnh gọi lại ủy quyền

Tiếp theo, chúng ta cần xác định logic sẽ thực sự xác định xem người dùng hiện đang được xác thực có thể nghe một kênh nhất định hay không. Điều này được thực hiện trong routes/channels.phptệp đi kèm với ứng dụng của bạn. Trong tệp này, bạn có thể sử dụng Broadcast::channelphương pháp để đăng ký lệnh gọi lại ủy quyền kênh:

Broadcast::channel('orders.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

Các channelphương pháp chấp nhận hai đối số: tên của kênh và một callback mà lợi nhuận truehoặc falsechỉ ra cho dù người dùng được ủy quyền để lắng nghe trên kênh.

Tất cả các lệnh gọi lại ủy quyền nhận người dùng hiện đã được xác thực làm đối số đầu tiên của họ và bất kỳ tham số ký tự đại diện bổ sung nào làm đối số tiếp theo của họ. Trong ví dụ này, chúng tôi đang sử dụng {orderId}trình giữ chỗ để cho biết rằng phần "ID" của tên kênh là ký tự đại diện.

 

Ràng buộc mô hình gọi lại ủy quyền

Cũng giống như các tuyến HTTP, các tuyến kênh cũng có thể tận dụng lợi thế của ràng buộc mô hình tuyến ngầm và rõ ràng . Ví dụ: thay vì nhận được một chuỗi hoặc ID thứ tự số, bạn có thể yêu cầu một phiên bản Ordermô hình thực tế :

use App\Models\Order;

Broadcast::channel('orders.{order}', function ($user, Order $order) {
    return $user->id === $order->user_id;
});

 

Không giống như ràng buộc mô hình tuyến HTTP, ràng buộc mô hình kênh không hỗ trợ phạm vi ràng buộc mô hình ngầm định tự động . Tuy nhiên, điều này hiếm khi là một vấn đề vì hầu hết các kênh có thể được xác định phạm vi dựa trên khóa chính, duy nhất của một mô hình.

 

 

Xác thực gọi lại ủy quyền

Các kênh phát sóng riêng tư và hiện diện xác thực người dùng hiện tại thông qua trình bảo vệ xác thực mặc định của ứng dụng của bạn. Nếu người dùng không được xác thực, ủy quyền kênh sẽ tự động bị từ chối và lệnh gọi lại ủy quyền sẽ không bao giờ được thực thi. Tuy nhiên, bạn có thể chỉ định nhiều bảo vệ tùy chỉnh sẽ xác thực yêu cầu đến nếu cần:

Broadcast::channel('channel', function () {
    // ...
}, ['guards' => ['web', 'admin']]);

 

Xác định các lớp kênh

Nếu ứng dụng của bạn sử dụng nhiều kênh khác nhau, routes/channels.phptệp của bạn có thể trở nên cồng kềnh. Vì vậy, thay vì sử dụng các đóng để cấp quyền cho các kênh, bạn có thể sử dụng các lớp kênh. Để tạo một lớp kênh, hãy sử dụng make:channellệnh Artisan. Lệnh này sẽ đặt một lớp kênh mới trong App/Broadcastingthư mục.

php artisan make:channel OrderChannel

Tiếp theo, đăng ký kênh của bạn trong routes/channels.phptệp của bạn :

use App\Broadcasting\OrderChannel;

Broadcast::channel('orders.{order}', OrderChannel::class);

Cuối cùng, bạn có thể đặt logic ủy quyền cho kênh của mình trong joinphương thức của lớp kênh . Đây joinphương pháp sẽ là nơi đặt cùng một logic bạn sẽ thường đặt trong đóng cửa cho phép kênh của bạn. Bạn cũng có thể tận dụng lợi thế của ràng buộc mô hình kênh:

<?php

namespace App\Broadcasting;

use App\Models\Order;
use App\Models\User;

class OrderChannel
{
    /**
     * Create a new channel instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Authenticate the user's access to the channel.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Order  $order
     * @return array|bool
     */
    public function join(User $user, Order $order)
    {
        return $user->id === $order->user_id;
    }
}

 

Giống như nhiều lớp khác trong Laravel, các lớp kênh sẽ tự động được giải quyết bởi vùng chứa dịch vụ . Vì vậy, bạn có thể nhập gợi ý bất kỳ phụ thuộc nào mà kênh của bạn yêu cầu trong hàm tạo của nó.

 

 

Sự kiện phát sóng

Khi bạn đã xác định một sự kiện và đánh dấu sự kiện đó bằng ShouldBroadcastgiao diện, bạn chỉ cần kích hoạt sự kiện bằng cách sử dụng phương thức điều phối của sự kiện. Người điều phối sự kiện sẽ nhận thấy rằng sự kiện được đánh dấu bằng ShouldBroadcastgiao diện và sẽ xếp hàng sự kiện để phát sóng:

use App\Events\OrderShipmentStatusUpdated;

OrderShipmentStatusUpdated::dispatch($order);

 

Chỉ cho những người khác

Khi xây dựng một ứng dụng sử dụng tính năng phát sóng sự kiện, đôi khi bạn có thể cần phát sóng sự kiện cho tất cả người đăng ký một kênh nhất định ngoại trừ người dùng hiện tại. Bạn có thể thực hiện điều này bằng cách sử dụng trình broadcasttrợ giúp và toOthersphương pháp:

use App\Events\OrderShipmentStatusUpdated;

broadcast(new OrderShipmentStatusUpdated($update))->toOthers();

Để hiểu rõ hơn khi nào bạn có thể muốn sử dụng toOthersphương pháp này, hãy tưởng tượng một ứng dụng danh sách tác vụ trong đó người dùng có thể tạo một tác vụ mới bằng cách nhập tên tác vụ. Để tạo một nhiệm vụ, ứng dụng của bạn có thể đưa ra một yêu cầu đến một /taskURL truyền tải quá trình tạo của nhiệm vụ và trả về một biểu diễn JSON của nhiệm vụ mới. Khi ứng dụng JavaScript của bạn nhận được phản hồi từ điểm cuối, nó có thể chèn trực tiếp tác vụ mới vào danh sách tác vụ của nó như sau:

axios.post('/task', task)
    .then((response) => {
        this.tasks.push(response.data);
    });

Tuy nhiên, hãy nhớ rằng chúng tôi cũng phát sóng việc tạo nhiệm vụ. Nếu ứng dụng JavaScript của bạn cũng đang lắng nghe sự kiện này để thêm nhiệm vụ vào danh sách nhiệm vụ, bạn sẽ có các nhiệm vụ trùng lặp trong danh sách của mình: một từ điểm cuối và một từ chương trình phát sóng. Bạn có thể giải quyết vấn đề này bằng cách sử dụng toOthersphương pháp hướng dẫn người phát sóng không phát sự kiện cho người dùng hiện tại.

 

Sự kiện của bạn phải sử dụng Illuminate\Broadcasting\InteractsWithSocketsđặc điểm để gọi toOthersphương thức.

 

 

Cấu hình

Khi bạn khởi tạo một phiên bản Laravel Echo, một ID ổ cắm sẽ được gán cho kết nối. Nếu bạn đang sử dụng một phiên bản Axios chung để thực hiện các yêu cầu HTTP từ ứng dụng JavaScript của mình, ID socket sẽ tự động được đính kèm với mọi yêu cầu gửi đi dưới dạng X-Socket-IDtiêu đề. Sau đó, khi bạn gọi toOthersphương thức, Laravel sẽ trích xuất ID ổ cắm từ tiêu đề và hướng dẫn người phát sóng không phát tới bất kỳ kết nối nào với ID ổ cắm đó.

Nếu bạn không sử dụng phiên bản Axios toàn cầu, bạn sẽ cần phải định cấu hình thủ công ứng dụng JavaScript của mình để gửi X-Socket-IDtiêu đề với tất cả các yêu cầu gửi đi. Bạn có thể truy xuất ID ổ cắm bằng Echo.socketIdphương pháp:

var socketId = Echo.socketId();

 

Tùy chỉnh kết nối

Nếu ứng dụng của bạn tương tác với nhiều kết nối phát sóng và bạn muốn phát sự kiện bằng một đài truyền hình khác với chương trình mặc định của mình, bạn có thể chỉ định kết nối nào để đẩy một sự kiện đến bằng viaphương pháp:

use App\Events\OrderShipmentStatusUpdated;

broadcast(new OrderShipmentStatusUpdated($update))->via('pusher');

Ngoài ra, bạn có thể chỉ định kết nối phát sóng của sự kiện bằng cách gọi broadcastViaphương thức trong hàm tạo của sự kiện:

<?php

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\Queue\SerializesModels;

class OrderShipmentStatusUpdated implements ShouldBroadcast
{
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->broadcastVia('pusher');
    }
}

 

Nhận các chương trình phát sóng

 

Lắng nghe sự kiện

Khi bạn đã cài đặt và khởi tạo Laravel Echo , bạn đã sẵn sàng bắt đầu lắng nghe các sự kiện được phát từ ứng dụng Laravel của mình. Đầu tiên, sử dụng channelphương thức để truy xuất một phiên bản của kênh, sau đó gọi listenphương thức để lắng nghe một sự kiện được chỉ định:

Echo.channel(`orders.${this.order.id}`)
    .listen('OrderShipmentStatusUpdated', (e) => {
        console.log(e.order.name);
    });

Nếu bạn muốn nghe các sự kiện trên kênh riêng tư, hãy sử dụng privatephương pháp này để thay thế. Bạn có thể tiếp tục chuỗi các lệnh gọi đến listenphương thức để nghe nhiều sự kiện trên một kênh:

Echo.private(`orders.${this.order.id}`)
    .listen(...)
    .listen(...)
    .listen(...);

 

Rời khỏi kênh

Để rời khỏi một kênh, bạn có thể gọi leaveChannelphương thức trên phiên bản Echo của mình:

Echo.leaveChannel(`orders.${this.order.id}`);

Nếu bạn muốn rời khỏi một kênh cũng như các kênh riêng tư và kênh hiện diện liên quan, bạn có thể gọi leavephương thức:

Echo.leave(`orders.${this.order.id}`);

 

Không gian tên

Bạn có thể nhận thấy trong các ví dụ trên rằng chúng tôi không chỉ định vùng App\Eventstên đầy đủ cho các lớp sự kiện. Điều này là do Echo sẽ tự động giả định các sự kiện nằm trong App\Eventskhông gian tên. Tuy nhiên, bạn có thể định cấu hình không gian tên gốc khi khởi tạo Echo bằng cách chuyển namespacetùy chọn cấu hình:

window.Echo = new Echo({
    broadcaster: 'pusher',
    // ...
    namespace: 'App.Other.Namespace'
});

Ngoài ra, bạn có thể đặt trước các lớp sự kiện bằng a .khi đăng ký chúng bằng Echo. Điều này sẽ cho phép bạn luôn chỉ định tên lớp đủ điều kiện:

Echo.channel('orders')
    .listen('.Namespace\\Event\\Class', (e) => {
        //
    });

 

Kênh hiện diện

Các kênh hiện diện xây dựng dựa trên tính bảo mật của các kênh riêng tư đồng thời thể hiện thêm tính năng nhận biết ai đã đăng ký kênh. Điều này giúp bạn dễ dàng xây dựng các tính năng ứng dụng cộng tác, mạnh mẽ chẳng hạn như thông báo cho người dùng khi người dùng khác đang xem cùng một trang hoặc liệt kê các thành viên trong phòng trò chuyện.

 

Cho phép các kênh hiện diện

Tất cả các kênh hiện diện cũng là kênh riêng tư; do đó, người dùng phải được cấp phép để truy cập chúng . Tuy nhiên, khi xác định lệnh gọi lại ủy quyền cho các kênh hiện diện, bạn sẽ không quay lại truenếu người dùng được ủy quyền tham gia kênh. Thay vào đó, bạn nên trả về một mảng dữ liệu về người dùng.

Dữ liệu được trả về bởi lệnh gọi lại ủy quyền sẽ được cung cấp cho người nghe sự kiện kênh hiện diện trong ứng dụng JavaScript của bạn. Nếu người dùng không được phép tham gia kênh hiện diện, bạn nên quay lại falsehoặc null:

Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) {
        return ['id' => $user->id, 'name' => $user->name];
    }
});

 

Tham gia các kênh hiện diện

Để tham gia một kênh hiện diện, bạn có thể sử dụng joinphương pháp của Echo . Các joinphương pháp sẽ trả về một PresenceChannelthực hiện mà, cùng với lộ listenphương pháp, cho phép bạn đăng ký vào herejoiningvà leavingcác sự kiện.

Echo.join(`chat.${roomId}`)
    .here((users) => {
        //
    })
    .joining((user) => {
        console.log(user.name);
    })
    .leaving((user) => {
        console.log(user.name);
    })
    .error((error) => {
        console.error(error);
    });

Lệnh heregọi lại sẽ được thực hiện ngay lập tức sau khi kênh được tham gia thành công và sẽ nhận được một mảng chứa thông tin người dùng của tất cả những người dùng khác hiện đã đăng ký kênh. Các joiningphương pháp sẽ được thực hiện khi người dùng mới tham gia cuộc kênh, trong khi leavingphương pháp sẽ được thực hiện khi người dùng rời khỏi kênh. Các errorphương pháp sẽ được thực hiện khi các thiết bị đầu cuối xác thực trả về một mã trạng thái HTTP 200 hoặc nếu có một vấn đề phân tích cú pháp JSON trả lại.

 

Phát đến các kênh hiện diện

Các kênh hiện diện có thể nhận các sự kiện giống như các kênh công khai hoặc riêng tư. Sử dụng ví dụ về phòng trò chuyện, chúng tôi có thể muốn phát NewMessagecác sự kiện tới kênh hiện diện của phòng. Để làm như vậy, chúng tôi sẽ trả về một phiên bản của PresenceChanneltừ broadcastOnphương thức của sự kiện :

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PresenceChannel('room.'.$this->message->room_id);
}

Cũng như các sự kiện khác, bạn có thể sử dụng trình broadcasttrợ giúp và toOthersphương pháp để loại trừ người dùng hiện tại nhận chương trình phát sóng:

broadcast(new NewMessage($message));

broadcast(new NewMessage($message))->toOthers();

Như điển hình của các loại sự kiện khác, bạn có thể nghe các sự kiện được gửi đến các kênh hiện diện bằng listenphương pháp của Echo :

Echo.join(`chat.${roomId}`)
    .here(...)
    .joining(...)
    .leaving(...)
    .listen('NewMessage', (e) => {
        //
    });

 

Phát sóng mô hình

 

Trước khi đọc tài liệu sau về phát sóng mô hình, chúng tôi khuyên bạn nên làm quen với các khái niệm chung về các dịch vụ phát sóng mô hình của Laravel cũng như cách tạo và nghe các sự kiện phát sóng theo cách thủ công.

 

Thông thường các sự kiện phát sóng khi các mô hình Eloquent của ứng dụng của bạn được tạo, cập nhật hoặc xóa. Tất nhiên, điều này có thể dễ dàng được thực hiện bằng cách xác định thủ công các sự kiện tùy chỉnh cho các thay đổi trạng thái của mô hình Eloquent và đánh dấu các sự kiện đó bằng ShouldBroadcastgiao diện.

Tuy nhiên, nếu bạn không sử dụng các sự kiện này cho bất kỳ mục đích nào khác trong ứng dụng của mình, thì việc tạo các lớp sự kiện với mục đích duy nhất là phát chúng có thể rất phức tạp. Để khắc phục điều này, Laravel cho phép bạn chỉ ra rằng một mô hình Eloquent nên tự động phát các thay đổi trạng thái của nó.

Để bắt đầu, mô hình Eloquent của bạn nên sử dụng Illuminate\Database\Eloquent\BroadcastsEventsđặc điểm. Ngoài ra, mô hình phải xác định một broadcastsOnphương thức, phương thức này sẽ trả về một mảng các kênh mà các sự kiện của mô hình sẽ phát trên đó:

<?php

namespace App\Models;

use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Database\Eloquent\BroadcastsEvents;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use BroadcastsEvents, HasFactory;

    /**
     * Get the user that the post belongs to.
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * Get the channels that model events should broadcast on.
     *
     * @param  string  $event
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn($event)
    {
        return [$this, $this->user];
    }
}

Sau khi mô hình của bạn bao gồm đặc điểm này và xác định các kênh phát sóng, mô hình sẽ bắt đầu tự động phát các sự kiện khi một phiên bản mô hình được tạo, cập nhật, xóa, chuyển vào thùng rác hoặc khôi phục.

Ngoài ra, bạn có thể nhận thấy rằng broadcastOnphương thức nhận một $eventđối số chuỗi . Lập luận này có chứa các loại sự kiện đó đã xảy ra trên mô hình và sẽ có một giá trị createdupdateddeletedtrashed, hoặc restored. Bằng cách kiểm tra giá trị của biến này, bạn có thể xác định kênh nào (nếu có) mà mô hình sẽ phát cho một sự kiện cụ thể:

/**
 * Get the channels that model events should broadcast on.
 *
 * @param  string  $event
 * @return \Illuminate\Broadcasting\Channel|array
 */
public function broadcastOn($event)
{
    return match($event) {
        'deleted' => [],
        default => [$this, $this->user],
    };
}

 

Tùy chỉnh tạo sự kiện phát sóng mô hình

Đôi khi, bạn có thể muốn tùy chỉnh cách Laravel tạo sự kiện phát sóng mô hình cơ bản. Bạn có thể thực hiện điều này bằng cách xác định một newBroadcastableEventphương pháp trên mô hình Eloquent của bạn. Phương thức này sẽ trả về một Illuminate\Database\Eloquent\BroadcastableModelEventOccurredthể hiện:

use Illuminate\Database\Eloquent\BroadcastableModelEventOccurred

/**
 * Create a new broadcastable model event for the model.
 *
 * @param  string  $event
 * @return \Illuminate\Database\Eloquent\BroadcastableModelEventOccurred
 */
protected function newBroadcastableEvent($event)
{
    return (new BroadcastableModelEventOccurred(
        $this, $event
    ))->dontBroadcastToCurrentUser();
}

 

Quy ước về Phát sóng Mô hình

 

Quy ước kênh

Như bạn có thể nhận thấy, broadcastOnphương thức trong ví dụ mô hình ở trên không trả về các Channelphiên bản. Thay vào đó, các mô hình Eloquent được trả lại trực tiếp. Nếu một cá thể mô hình Eloquent được broadcastOnphương thức của mô hình của bạn trả về (hoặc được chứa trong một mảng được phương thức trả về), Laravel sẽ tự động khởi tạo một cá thể kênh riêng cho mô hình bằng cách sử dụng tên lớp và mã định danh khóa chính của mô hình làm tên kênh.

Vì vậy, một App\Models\Usermô hình với một idcủa 1sẽ được chuyển đổi thành một Illuminate\Broadcasting\PrivateChannelthể hiện có tên là App.Models.User.1. Tất nhiên, ngoài việc trả về các phiên bản mô hình Eloquent từ broadcastOnphương pháp của mô hình , bạn có thể trả lại các Channelphiên bản hoàn chỉnh để có toàn quyền kiểm soát tên kênh của mô hình:

use Illuminate\Broadcasting\PrivateChannel;

/**
 * Get the channels that model events should broadcast on.
 *
 * @param  string  $event
 * @return \Illuminate\Broadcasting\Channel|array
 */
public function broadcastOn($event)
{
    return [new PrivateChannel('user.'.$this->id)];
}

Nếu bạn định trả về một cách rõ ràng một cá thể kênh từ broadcastOnphương thức của mô hình , bạn có thể chuyển một cá thể mô hình Eloquent cho phương thức khởi tạo của kênh. Khi làm như vậy, Laravel sẽ sử dụng các quy ước kênh mô hình được thảo luận ở trên để chuyển mô hình Eloquent thành một chuỗi tên kênh:

return [new Channel($this->user)];

Nếu bạn cần xác định tên kênh của một mô hình, bạn có thể gọi broadcastChannelphương thức trên bất kỳ phiên bản mô hình nào. Ví dụ, phương pháp này sẽ trả về chuỗi App.Models.User.1cho một App\Models\Usermô hình với một idsố 1:

$user->broadcastChannel()

 

Quy ước sự kiện

Vì các sự kiện phát sóng mô hình không được liên kết với một sự kiện "thực tế" trong thư mục ứng dụng của bạn App\Events, chúng được gán tên và trọng tải dựa trên các quy ước. Quy ước của Laravel là phát sự kiện bằng cách sử dụng tên lớp của mô hình (không bao gồm không gian tên) và tên của sự kiện mô hình đã kích hoạt phát sóng.

Vì vậy, ví dụ: một bản cập nhật cho App\Models\Postmô hình sẽ truyền phát một sự kiện đến ứng dụng phía máy khách của bạn như PostUpdatedvới tải trọng sau:

{
    "model": {
        "id": 1,
        "title": "My first post"
        ...
    },
    ...
    "socket": "someSocketId",
}

Việc xóa App\Models\Usermô hình sẽ phát sóng một sự kiện có tên UserDeleted.

Nếu muốn, bạn có thể xác định tên truyền phát tùy chỉnh và trọng tải bằng cách thêm một broadcastAsvà broadcastWithphương thức vào mô hình của mình. Các phương thức này nhận tên của sự kiện / hoạt động mô hình đang xảy ra, cho phép bạn tùy chỉnh tên sự kiện và tải trọng cho mỗi hoạt động mô hình. Nếu nullđược trả về từ broadcastAsphương thức, Laravel sẽ sử dụng các quy ước về tên sự kiện phát sóng mô hình được thảo luận ở trên khi phát sóng sự kiện:

/**
 * The model event's broadcast name.
 *
 * @param  string  $event
 * @return string|null
 */
public function broadcastAs($event)
{
    return match ($event) {
        'created' => 'post.created',
        default => null,
    };
}

/**
 * Get the data to broadcast for the model.
 *
 * @param  string  $event
 * @return array
 */
public function broadcastWith($event)
{
    return match ($event) {
        'created' => ['title' => $this->title],
        default => ['model' => $this],
    };
}

 

Lắng nghe các chương trình phát sóng mô hình

Khi bạn đã thêm BroadcastsEventsđặc điểm vào mô hình của mình và xác định broadcastOnphương pháp của mô hình , bạn đã sẵn sàng bắt đầu lắng nghe các sự kiện mô hình được phát trong ứng dụng phía máy khách của mình. Trước khi bắt đầu, bạn có thể tham khảo tài liệu đầy đủ về lắng nghe các sự kiện .

Đầu tiên, sử dụng privatephương thức để lấy một phiên bản của một kênh, sau đó gọi listenphương thức để lắng nghe một sự kiện được chỉ định. Thông thường, tên kênh được cung cấp cho privatephương thức phải tương ứng với các quy ước phát sóng mô hình của Laravel .

Khi bạn đã có được một phiên bản kênh, bạn có thể sử dụng listenphương pháp này để lắng nghe một sự kiện cụ thể. Vì các sự kiện phát sóng mô hình không được liên kết với một sự kiện "thực tế" trong thư mục ứng dụng của bạn App\Eventstên sự kiện phải được bắt đầu bằng một .để cho biết nó không thuộc một không gian tên cụ thể. Mỗi sự kiện truyền phát mô hình có một thuộc modeltính chứa tất cả các thuộc tính có thể phát sóng của mô hình:

Echo.private(`App.Models.User.${this.user.id}`)
    .listen('.PostUpdated', (e) => {
        console.log(e.model);
    });

 

Sự kiện khách hàng

 

Khi sử dụng Pusher Channels , bạn phải bật tùy chọn "Sự kiện ứng dụng" trong phần "Cài đặt ứng dụng" trên trang tổng quan ứng dụng của bạn để gửi các sự kiện khách.

 

Đôi khi bạn có thể muốn truyền phát một sự kiện cho các máy khách được kết nối khác mà không cần nhấn vào ứng dụng Laravel của bạn. Điều này có thể đặc biệt hữu ích cho những thứ như thông báo "đang nhập", nơi bạn muốn thông báo cho người dùng ứng dụng của mình rằng người dùng khác đang nhập tin nhắn trên một màn hình nhất định.

Để phát các sự kiện của khách hàng, bạn có thể sử dụng whisperphương pháp của Echo :

Echo.private(`chat.${roomId}`)
    .whisper('typing', {
        name: this.user.name
    });

Để lắng nghe các sự kiện của khách hàng, bạn có thể sử dụng listenForWhisperphương pháp:

Echo.private(`chat.${roomId}`)
    .listenForWhisper('typing', (e) => {
        console.log(e.name);
    });

 

Thông báo

Bằng cách ghép nối phát sóng sự kiện với thông báo , ứng dụng JavaScript của bạn có thể nhận được thông báo mới khi chúng xuất hiện mà không cần phải làm mới trang. Trước khi bắt đầu, hãy nhớ đọc qua tài liệu về cách sử dụng kênh thông báo quảng bá .

Khi bạn đã định cấu hình thông báo để sử dụng kênh quảng bá, bạn có thể nghe các sự kiện phát sóng bằng notificationphương pháp của Echo . Hãy nhớ rằng tên kênh phải khớp với tên lớp của thực thể nhận thông báo:

Echo.private(`App.Models.User.${userId}`)
    .notification((notification) => {
        console.log(notification.type);
    });

Trong ví dụ này, tất cả các thông báo được gửi đến các App\Models\Userphiên bản qua broadcastkênh sẽ được gọi lại nhận được. Một lệnh gọi lại ủy quyền kênh cho App.Models.User.{id}kênh được bao gồm trong mặc định BroadcastServiceProviderđi kèm với khung Laravel.

» Tiếp: Lập lịch tác vụ
« Trước: Hàng đợi (Queues)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!