Laravel: Thông báo (Notifications)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

 

Giới thiệu

Ngoài hỗ trợ gửi email , Laravel còn hỗ trợ gửi thông báo trên nhiều kênh gửi, bao gồm email, SMS (qua Vonage , trước đây gọi là Nexmo) và Slack . Ngoài ra, một loạt các kênh thông báo do cộng đồng xây dựng đã được tạo ra để gửi thông báo qua hàng chục kênh khác nhau! Thông báo cũng có thể được lưu trữ trong cơ sở dữ liệu để chúng có thể được hiển thị trong giao diện web của bạn.

Thông thường, thông báo phải là những tin nhắn ngắn gọn, mang tính thông tin để thông báo cho người dùng về điều gì đó đã xảy ra trong ứng dụng của bạn. Ví dụ: nếu bạn đang viết ứng dụng thanh toán, bạn có thể gửi thông báo "Hóa đơn đã thanh toán" cho người dùng của mình qua các kênh email và SMS.

 

Tạo thông báo

Trong Laravel, mỗi thông báo được đại diện bởi một lớp duy nhất thường được lưu trữ trong app/Notificationsthư mục. Đừng lo lắng nếu bạn không thấy thư mục này trong ứng dụng của mình - nó sẽ được tạo cho bạn khi bạn chạy make:notificationlệnh Artisan:

php artisan make:notification InvoicePaid

Lệnh này sẽ đặt một lớp thông báo mới trong app/Notificationsthư mục của bạn . Mỗi lớp thông báo chứa một viaphương thức và một số phương thức xây dựng thông báo, chẳng hạn như toMailhoặc toDatabase, chuyển đổi thông báo thành một thông báo được điều chỉnh cho kênh cụ thể đó.

 

Gửi thông báo

 

Sử dụng đặc điểm đáng chú ý

Thông báo có thể được gửi theo hai cách: sử dụng notifyphương pháp của Notifiableđặc điểm hoặc sử dụng Notification mặt tiền . Các Notifiableđặc điểm được đưa vào ứng dụng của bạn App\Models\Usermô hình theo mặc định:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
}

Các notifyphương pháp được cung cấp bởi dự đoán đặc điểm này để nhận một trường hợp thông báo:

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));

 

Hãy nhớ rằng, bạn có thể sử dụng Notifiableđặc điểm trên bất kỳ mô hình nào của mình. Bạn không bị giới hạn chỉ bao gồm nó trên Usermô hình của bạn .

 

 

Sử dụng Mặt thông báo

Ngoài ra, bạn có thể gửi thông báo qua Notification mặt tiền . Cách tiếp cận này hữu ích khi bạn cần gửi thông báo đến nhiều thực thể đáng tin cậy, chẳng hạn như một tập hợp người dùng. Để gửi thông báo bằng cách sử dụng mặt tiền, hãy chuyển tất cả các thực thể đáng chú ý và phiên bản thông báo cho sendphương thức:

use Illuminate\Support\Facades\Notification;

Notification::send($users, new InvoicePaid($invoice));

Bạn cũng có thể gửi thông báo ngay lập tức bằng sendNowphương pháp này. Phương thức này sẽ gửi thông báo ngay lập tức ngay cả khi thông báo triển khai ShouldQueuegiao diện:

Notification::sendNow($developers, new DeploymentCompleted($deployment));

 

Chỉ định các kênh phân phối

Mỗi lớp thông báo đều có một viaphương thức xác định kênh nào sẽ gửi thông báo. Thông báo có thể được gửi vào maildatabasebroadcastnexmo, và slackcác kênh truyền hình.

 

Nếu bạn muốn sử dụng các kênh phân phối khác như Telegram hoặc Pusher, hãy xem trang web Kênh thông báo Laravel do cộng đồng điều hành .

 

Các viaphương pháp nhận được một $notifiableví dụ, đó sẽ là một thể hiện của lớp mà thông báo được gửi. Bạn có thể sử dụng $notifiableđể xác định kênh nào sẽ gửi thông báo:

/**
 * Get the notification's delivery channels.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function via($notifiable)
{
    return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
}

 

Thông báo xếp hàng

 

Trước khi thông báo xếp hàng, bạn nên định cấu hình hàng đợi của mình và bắt đầu một nhân viên .

 

Việc gửi thông báo có thể mất thời gian, đặc biệt nếu kênh cần thực hiện lệnh gọi API bên ngoài để gửi thông báo. Để tăng tốc thời gian phản hồi của ứng dụng, hãy để thông báo của bạn được xếp hàng đợi bằng cách thêm ShouldQueuegiao diện và Queueableđặc điểm vào lớp của bạn. Giao diện và đặc điểm đã được nhập cho tất cả các thông báo được tạo bằng make:notificationlệnh, vì vậy bạn có thể ngay lập tức thêm chúng vào lớp thông báo của mình:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification implements ShouldQueue
{
    use Queueable;

    // ...
}

Khi ShouldQueuegiao diện đã được thêm vào thông báo của bạn, bạn có thể gửi thông báo như bình thường. Laravel sẽ phát hiện ShouldQueuegiao diện trên lớp và tự động xếp hàng gửi thông báo:

$user->notify(new InvoicePaid($invoice));

Nếu bạn muốn trì hoãn việc gửi thông báo, bạn có thể xâu chuỗi delayphương pháp vào phần khởi tạo thông báo của mình:

$delay = now()->addMinutes(10);

$user->notify((new InvoicePaid($invoice))->delay($delay));

Bạn có thể chuyển một mảng cho delayphương thức để chỉ định lượng thời gian trễ cho các kênh cụ thể:

$user->notify((new InvoicePaid($invoice))->delay([
    'mail' => now()->addMinutes(5),
    'sms' => now()->addMinutes(10),
]));

Khi thông báo xếp hàng, một công việc đã xếp hàng sẽ được tạo cho từng người nhận và kết hợp kênh. Ví dụ: sáu công việc sẽ được gửi đến hàng đợi nếu thông báo của bạn có ba người nhận và hai kênh.

 

Tùy chỉnh kết nối hàng đợi thông báo

Theo mặc định, các thông báo đã xếp hàng sẽ được xếp vào hàng đợi bằng cách sử dụng kết nối hàng đợi mặc định của ứng dụng của bạn. Nếu bạn muốn chỉ định một kết nối khác sẽ được sử dụng cho một thông báo cụ thể, bạn có thể xác định một thuộc $connectiontính trên lớp thông báo:

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

 

Tùy chỉnh hàng đợi kênh thông báo

Nếu bạn muốn chỉ định một hàng đợi cụ thể sẽ được sử dụng cho từng kênh thông báo được thông báo hỗ trợ, bạn có thể xác định một viaQueuesphương pháp trên thông báo của mình. Phương thức này sẽ trả về một mảng các cặp tên kênh / tên hàng đợi:

/**
 * Determine which queues should be used for each notification channel.
 *
 * @return array
 */
public function viaQueues()
{
    return [
        'mail' => 'mail-queue',
        'slack' => 'slack-queue',
    ];
}

 

Thông báo đã xếp hàng & Giao dịch cơ sở dữ liệu

Khi các thông báo xếp hàng đợi đượ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 thông báo của bạn phụ thuộc vào các kiểu máy này, các lỗi không mong muốn có thể xảy ra khi công việc gửi thông báo đã xếp hàng đợi đượ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 thông báo được xếp hàng đợi 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 thông báo:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification implements ShouldQueue
{
    use Queueable;

    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 .

 

 

Thông báo theo yêu cầu

Đôi khi bạn có thể cần phải gửi thông báo cho một người nào đó không được lưu trữ với tư cách là "người dùng" ứng dụng của bạn. Sử dụng phương pháp Notificationcủa mặt tiền route, bạn có thể chỉ định thông tin định tuyến thông báo đặc biệt trước khi gửi thông báo:

Notification::route('mail', 'taylor@example.com')
            ->route('nexmo', '5555555555')
            ->route('slack', 'https://hooks.slack.com/services/...')
            ->notify(new InvoicePaid($invoice));

Nếu bạn muốn cung cấp tên của người nhận khi gửi thông báo theo yêu cầu cho mailtuyến đường, bạn có thể cung cấp một mảng chứa địa chỉ email làm khóa và tên là giá trị của phần tử đầu tiên trong mảng:

Notification::route('mail', [
    'barrett@example.com' => 'Barrett Blair',
])->notify(new InvoicePaid($invoice));

 

Thông báo qua thư

 

Định dạng Tin nhắn Thư

Nếu thông báo hỗ trợ được gửi dưới dạng email, bạn nên xác định một toMailphương thức trên lớp thông báo. Phương thức này sẽ nhận một $notifiablethực thể và sẽ trả về một Illuminate\Notifications\Messages\MailMessagethể hiện.

Các MailMessagelớp có chứa một vài phương pháp đơn giản để giúp bạn xây dựng các thông điệp email giao dịch. Thư có thể chứa các dòng văn bản cũng như một "lời kêu gọi hành động". Hãy xem một toMailphương pháp ví dụ :

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
                ->greeting('Hello!')
                ->line('One of your invoices has been paid!')
                ->action('View Invoice', $url)
                ->line('Thank you for using our application!');
}

 

Lưu ý rằng chúng tôi đang sử dụng $this->invoice->idtrong toMailphương pháp của chúng tôi . Bạn có thể chuyển bất kỳ dữ liệu nào mà thông báo của bạn cần để tạo thông báo của nó vào phương thức khởi tạo của thông báo.

 

Trong ví dụ này, chúng tôi đăng ký một lời chào, một dòng văn bản, một lời kêu gọi hành động và sau đó là một dòng văn bản khác. Các phương pháp này do MailMessageđối tượng cung cấp giúp việc định dạng các email giao dịch nhỏ trở nên đơn giản và nhanh chóng. Sau đó, kênh thư sẽ dịch các thành phần thư thành một mẫu email HTML đáp ứng, đẹp mắt với đối tác văn bản thuần túy. Dưới đây là ví dụ về email do mailkênh tạo:

 

Khi gửi thông báo qua thư, hãy đảm bảo đặt nametùy chọn cấu hình trong config/app.phptệp cấu hình của bạn . Giá trị này sẽ được sử dụng trong đầu trang và chân trang của thư thông báo qua thư của bạn.

 

 

Các tùy chọn định dạng thông báo thư khác

Thay vì xác định "dòng" văn bản trong lớp thông báo, bạn có thể sử dụng viewphương pháp để chỉ định mẫu tùy chỉnh sẽ được sử dụng để hiển thị email thông báo:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)->view(
        'emails.name', ['invoice' => $this->invoice]
    );
}

Bạn có thể chỉ định dạng xem văn bản thuần túy cho thư bằng cách chuyển tên dạng xem làm phần tử thứ hai của mảng được cấp cho viewphương thức:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)->view(
        ['emails.name.html', 'emails.name.plain'],
        ['invoice' => $this->invoice]
    );
}

 

Thông báo lỗi

Một số thông báo thông báo cho người dùng về các lỗi, chẳng hạn như thanh toán hóa đơn không thành công. Bạn có thể chỉ ra rằng một thư liên quan đến lỗi bằng cách gọi errorphương thức khi xây dựng thư của bạn. Khi sử dụng errorphương pháp trên thư, nút gọi hành động sẽ có màu đỏ thay vì màu đen:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Message
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->error()
                ->subject('Notification Subject')
                ->line('...');
}

 

Tùy chỉnh người gửi

Theo mặc định, địa chỉ người gửi / từ của email được xác định trong config/mail.phptệp cấu hình. Tuy nhiên, bạn có thể chỉ định địa chỉ từ cho một thông báo cụ thể bằng fromphương pháp:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->from('barrett@example.com', 'Barrett Blair')
                ->line('...');
}

 

Tùy chỉnh Người nhận

Khi gửi thông báo qua mailkênh, hệ thống thông báo sẽ tự động tìm kiếm thuộc emailtính trên thực thể đáng tin cậy của bạn. Bạn có thể tùy chỉnh địa chỉ email nào được sử dụng để gửi thông báo bằng cách xác định một routeNotificationForMailphương pháp trên thực thể đáng tin cậy:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * Route notifications for the mail channel.
     *
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return array|string
     */
    public function routeNotificationForMail($notification)
    {
        // Return email address only...
        return $this->email_address;

        // Return email address and name...
        return [$this->email_address => $this->name];
    }
}

 

Tùy chỉnh chủ đề

Theo mặc định, chủ đề của email là tên lớp của thông báo được định dạng thành "Title Case". Vì vậy, nếu lớp thông báo của bạn được đặt tên InvoicePaid, chủ đề của email sẽ là Invoice Paid. Nếu bạn muốn chỉ định một chủ đề khác cho thông báo, bạn có thể gọi subjectphương thức khi xây dựng thông điệp của mình:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->subject('Notification Subject')
                ->line('...');
}

 

Tùy chỉnh Người gửi thư

Theo mặc định, thông báo email sẽ được gửi bằng cách sử dụng phong bì mặc định được xác định trong config/mail.phptệp cấu hình. Tuy nhiên, bạn có thể chỉ định một bưu phẩm khác trong thời gian chạy bằng cách gọi mailerphương thức khi tạo thư của bạn:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->mailer('postmark')
                ->line('...');
}

 

Tùy chỉnh các mẫu

Bạn có thể sửa đổi HTML và mẫu văn bản thuần túy được sử dụng bởi thông báo qua thư bằng cách xuất bản tài nguyên của gói thông báo. Sau khi chạy lệnh này, các mẫu thông báo thư sẽ được đặt trong resources/views/vendor/notificationsthư mục:

php artisan vendor:publish --tag=laravel-notifications

 

Tệp đính kèm

Để thêm tệp đính kèm vào thông báo qua email, hãy sử dụng attachphương pháp này trong khi xây dựng thông báo của bạn. Các attachphương pháp chấp nhận đường dẫn tuyệt đối đến tập tin như là đối số đầu tiên của mình:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attach('/path/to/file');
}

Khi đính kèm tệp vào thư, bạn cũng có thể chỉ định tên hiển thị và / hoặc kiểu MIME bằng cách chuyển arraylàm đối số thứ hai cho attachphương thức:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attach('/path/to/file', [
                    'as' => 'name.pdf',
                    'mime' => 'application/pdf',
                ]);
}

Không giống như đính kèm tệp trong các đối tượng có thể gửi thư, bạn không thể đính kèm tệp trực tiếp từ đĩa lưu trữ bằng cách sử dụng attachFromStorage. Bạn nên sử dụng attachphương pháp với một đường dẫn tuyệt đối đến tệp trên đĩa lưu trữ. Ngoài ra, bạn có thể trả về một thư có thể gửi từ toMailphương thức:

use App\Mail\InvoicePaid as InvoicePaidMailable;

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return Mailable
 */
public function toMail($notifiable)
{
    return (new InvoicePaidMailable($this->invoice))
                ->to($notifiable->email)
                ->attachFromStorage('/path/to/file');
}

 

Tệp đính kèm dữ liệu thô

Các attachDataphương pháp có thể được sử dụng để đính kèm một chuỗi nguyên byte như một tập tin đính kèm. Khi gọi attachDataphương thức, bạn nên cung cấp tên tệp sẽ được gán cho phần đính kèm:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attachData($this->pdf, 'name.pdf', [
                    'mime' => 'application/pdf',
                ]);
}

 

Sử dụng Mailables

Nếu cần, bạn có thể trả về một đối tượng có thể gửi thư đầy đủ từ toMailphương thức thông báo của bạn . Khi trả về một Mailablethay vì a MailMessage, bạn sẽ cần chỉ định người nhận thư bằng tophương thức của đối tượng có thể gửi thư :

use App\Mail\InvoicePaid as InvoicePaidMailable;

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return Mailable
 */
public function toMail($notifiable)
{
    return (new InvoicePaidMailable($this->invoice))
                ->to($notifiable->email);
}

 

Thư tín & Thông báo theo yêu cầu

Nếu bạn đang gửi một thông báo theo yêu cầu , $notifiablephiên bản được cung cấp cho toMailphương thức sẽ là một phiên bản Illuminate\Notifications\AnonymousNotifiable, cung cấp một routeNotificationForphương thức có thể được sử dụng để truy xuất địa chỉ email mà thông báo theo yêu cầu sẽ được gửi đến:

use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Notifications\AnonymousNotifiable;

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return Mailable
 */
public function toMail($notifiable)
{
    $address = $notifiable instanceof AnonymousNotifiable
            ? $notifiable->routeNotificationFor('mail')
            : $notifiable->email;

    return (new InvoicePaidMailable($this->invoice))
                ->to($address);
}

 

Xem trước thông báo thư

Khi thiết kế một mẫu thông báo thư, thật tiện lợi để xem trước nhanh chóng thông báo thư được kết xuất trong trình duyệt của bạn giống như một mẫu Blade điển hình. Vì lý do này, Laravel cho phép bạn trả lại bất kỳ thư nào được tạo bởi thông báo thư trực tiếp từ bộ điều khiển hoặc đóng lộ trình. Khi một MailMessageđược trả lại, nó sẽ được hiển thị và hiển thị trong trình duyệt, cho phép bạn nhanh chóng xem trước thiết kế của nó mà không cần gửi nó đến một địa chỉ email thực tế:

use App\Models\Invoice;
use App\Notifications\InvoicePaid;

Route::get('/notification', function () {
    $invoice = Invoice::find(1);

    return (new InvoicePaid($invoice))
                ->toMail($invoice->user);
});

 

Đánh dấu Thư thông báo

Thông báo thư đánh dấu cho phép bạn tận dụng các mẫu thông báo thư được tạo sẵn, đồng thời cho phép bạn tự do viết thư dài hơn, tùy chỉnh. Vì các tin nhắn được viết bằng Markdown, Laravel có thể hiển thị các mẫu HTML đẹp, đáp ứng cho các tin nhắn trong khi cũng tự động tạo một bản đối chiếu văn bản thuần túy.

 

Tạo thông điệp

Để tạo thông báo với mẫu Markdown tương ứng, bạn có thể sử dụng --markdowntùy chọn của make:notificationlệnh Artisan:

php artisan make:notification InvoicePaid --markdown=mail.invoice.paid

Giống như tất cả các thông báo thư khác, các thông báo sử dụng mẫu Markdown phải xác định một toMailphương thức trên lớp thông báo của chúng. Tuy nhiên, thay vì sử dụng các linevà actionphương pháp để tạo thông báo, hãy sử dụng markdownphương thức để chỉ định tên của mẫu Markdown sẽ được sử dụng. Một mảng dữ liệu bạn muốn cung cấp cho mẫu có thể được chuyển làm đối số thứ hai của phương thức:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
                ->subject('Invoice Paid')
                ->markdown('mail.invoice.paid', ['url' => $url]);
}

 

Viết tin nhắn

Thông báo thư Markdown sử dụng kết hợp các thành phần Blade và cú pháp Markdown cho phép bạn dễ dàng tạo thông báo trong khi tận dụng các thành phần thông báo được tạo sẵn của Laravel:

@component('mail::message')
# Invoice Paid

Your invoice has been paid!

@component('mail::button', ['url' => $url])
View Invoice
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

 

Thành phần nút

Thành phần nút hiển thị một liên kết nút được căn giữa. Thành phần chấp nhận hai đối số, a urlvà một tùy chọn color. Màu sắc được hỗ trợ là primarygreen, và red. Bạn có thể thêm nhiều thành phần nút vào thông báo như bạn muốn:

@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent

 

Thành phần bảng điều khiển

Thành phần bảng hiển thị khối văn bản nhất định trong một bảng có màu nền hơi khác so với phần còn lại của thông báo. Điều này cho phép bạn thu hút sự chú ý vào một khối văn bản nhất định:

@component('mail::panel')
This is the panel content.
@endcomponent

 

Thành phần bảng

Thành phần bảng cho phép bạn chuyển đổi bảng Markdown thành một bảng HTML. Thành phần chấp nhận bảng Markdown làm nội dung của nó. Căn chỉnh cột trong bảng được hỗ trợ bằng cú pháp căn chỉnh bảng Markdown mặc định:

@component('mail::table')
| Laravel       | Table         | Example  |
| ------------- |:-------------:| --------:|
| Col 2 is      | Centered      | $10      |
| Col 3 is      | Right-Aligned | $20      |
@endcomponent

 

Tùy chỉnh các thành phần

Bạn có thể xuất tất cả các thành phần thông báo Markdown sang ứng dụng của riêng mình để tùy chỉnh. Để xuất các thành phần, hãy sử dụng vendor:publishlệnh Artisan để xuất bản laravel-mailthẻ nội dung:

php artisan vendor:publish --tag=laravel-mail

Lệnh này sẽ xuất bản các thành phần thư Markdown vào resources/views/vendor/mailthư mục. Thư mục mailsẽ chứa một htmlvà một textthư mục, mỗi thư mục chứa các đại diện tương ứng của mọi thành phần có sẵn. Bạn có thể tự do tùy chỉnh các thành phần này theo cách bạn muốn.

 

Tùy chỉnh CSS

Sau khi xuất các thành phần, resources/views/vendor/mail/html/themesthư mục sẽ chứa một default.csstệp. Bạn có thể tùy chỉnh CSS trong tệp này và các kiểu của bạn sẽ tự động được xếp vào hàng trong các phần trình bày HTML của thông báo Markdown của bạn.

Nếu bạn muốn xây dựng một chủ đề hoàn toàn mới cho các thành phần Markdown của Laravel, bạn có thể đặt một tệp CSS trong html/themesthư mục. Sau khi đặt tên và lưu tệp CSS của bạn, hãy cập nhật themetùy chọn của mailtệp cấu hình để khớp với tên của chủ đề mới của bạn.

Để tùy chỉnh chủ đề cho một thông báo riêng lẻ, bạn có thể gọi themephương thức trong khi xây dựng thư e-mail của thông báo. Các themephương pháp chấp nhận tên của đề tài mà nên được sử dụng khi gửi thông báo:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->theme('invoice')
                ->subject('Invoice Paid')
                ->markdown('mail.invoice.paid', ['url' => $url]);
}

 

Thông báo cơ sở dữ liệu

 

Điều kiện tiên quyết

Các databasekênh thông báo lưu trữ các thông tin thông báo trong một bảng cơ sở dữ liệu. Bảng này sẽ chứa thông tin như loại thông báo cũng như cấu trúc dữ liệu JSON mô tả thông báo.

Bạn có thể truy vấn bảng để hiển thị các thông báo trong giao diện người dùng của ứng dụng. Tuy nhiên, trước khi bạn có thể làm điều đó, bạn sẽ cần tạo một bảng cơ sở dữ liệu để chứa các thông báo của mình. Bạn có thể sử dụng notifications:tablelệnh để tạo sự di chuyển với lược đồ bảng thích hợp:

php artisan notifications:table

php artisan migrate

 

Định dạng thông báo cơ sở dữ liệu

Nếu thông báo hỗ trợ được lưu trữ trong bảng cơ sở dữ liệu, bạn nên xác định một toDatabasehoặc toArrayphương thức trên lớp thông báo. Phương thức này sẽ nhận một $notifiablethực thể và sẽ trả về một mảng PHP thuần túy. Mảng được trả về sẽ được mã hóa dưới dạng JSON và được lưu trữ trong datacột của notificationsbảng của bạn . Hãy xem một toArrayphương pháp ví dụ :

/**
 * Get the array representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function toArray($notifiable)
{
    return [
        'invoice_id' => $this->invoice->id,
        'amount' => $this->invoice->amount,
    ];
}

 

toDatabase Vs. toArray

Các toArrayphương pháp cũng được sử dụng bởi các broadcastkênh để xác định dữ liệu để phát sóng đến frontend trợ JavaScript của bạn. Nếu bạn muốn có hai biểu diễn mảng khác nhau cho databasevà broadcastcác kênh, bạn nên xác định một toDatabasephương thức thay vì một toArrayphương thức.

 

Truy cập thông báo

Sau khi thông báo được lưu trữ trong cơ sở dữ liệu, bạn cần một cách thuận tiện để truy cập chúng từ các thực thể đáng tin cậy của mình. Các Illuminate\Notifications\Notifiableđặc điểm, được bao gồm trên mặc định Laravel của App\Models\Usermô hình, bao gồm một notifications mối quan hệ hùng biện mà trả về thông báo cho đơn vị. Để tìm nạp thông báo, bạn có thể truy cập phương thức này giống như bất kỳ mối quan hệ Eloquent nào khác. Theo mặc định, các thông báo sẽ được sắp xếp theo created_atdấu thời gian với các thông báo gần đây nhất ở đầu bộ sưu tập:

$user = App\Models\User::find(1);

foreach ($user->notifications as $notification) {
    echo $notification->type;
}

Nếu bạn chỉ muốn truy xuất các thông báo "chưa đọc", bạn có thể sử dụng unreadNotificationsmối quan hệ. Một lần nữa, các thông báo này sẽ được sắp xếp theo created_atdấu thời gian với các thông báo gần đây nhất ở đầu bộ sưu tập:

$user = App\Models\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    echo $notification->type;
}

 

Để truy cập thông báo từ ứng dụng JavaScript của bạn, bạn nên xác định bộ điều khiển thông báo cho ứng dụng của mình, bộ điều khiển này sẽ trả về thông báo cho một thực thể đáng tin cậy, chẳng hạn như người dùng hiện tại. Sau đó, bạn có thể thực hiện một yêu cầu HTTP tới URL của bộ điều khiển đó từ ứng dụng JavaScript của bạn.

 

 

Đánh dấu thông báo là đã đọc

Thông thường, bạn sẽ muốn đánh dấu một thông báo là "đã đọc" khi người dùng xem nó. Các Illuminate\Notifications\Notifiableđặc điểm cung cấp một markAsReadphương pháp, trong đó cập nhật các read_atcột trong lịch sử cơ sở dữ liệu của thông báo:

$user = App\Models\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
}

Tuy nhiên, thay vì lặp lại từng thông báo, bạn có thể sử dụng markAsReadphương pháp trực tiếp trên tập hợp các thông báo:

$user->unreadNotifications->markAsRead();

Bạn cũng có thể sử dụng truy vấn cập nhật hàng loạt để đánh dấu tất cả các thông báo là đã đọc mà không cần truy xuất chúng từ cơ sở dữ liệu:

$user = App\Models\User::find(1);

$user->unreadNotifications()->update(['read_at' => now()]);

Bạn có thể deletenhận thông báo để xóa chúng khỏi bảng hoàn toàn:

$user->notifications()->delete();

 

Phát thông báo

 

Điều kiện tiên quyết

Trước khi phát thông báo, bạn nên cấu hình và làm quen với các dịch vụ phát sự kiện của Laravel . Phát sự kiện cung cấp một cách để phản ứng với các sự kiện Laravel phía máy chủ từ giao diện người dùng được hỗ trợ JavaScript của bạn.

 

Định dạng thông báo phát sóng

Các broadcastchương trình phát sóng kênh thông báo sử dụng Laravel của sự kiện quảng bá dịch vụ, cho phép frontend trợ JavaScript của bạn để thông báo bắt trong thời gian thực. Nếu một thông báo hỗ trợ phát sóng, bạn có thể xác định một toBroadcastphương thức trên lớp thông báo. Phương thức này sẽ nhận một $notifiablethực thể và sẽ trả về một BroadcastMessagethể hiện. Nếu toBroadcastphương thức không tồn tại, toArrayphương thức sẽ được sử dụng để thu thập dữ liệu cần được phát sóng. Dữ liệu trả về sẽ được mã hóa dưới dạng JSON và phát tới giao diện người dùng hỗ trợ JavaScript của bạn. Hãy xem một toBroadcastphương pháp ví dụ :

use Illuminate\Notifications\Messages\BroadcastMessage;

/**
 * Get the broadcastable representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return BroadcastMessage
 */
public function toBroadcast($notifiable)
{
    return new BroadcastMessage([
        'invoice_id' => $this->invoice->id,
        'amount' => $this->invoice->amount,
    ]);
}

 

Cấu hình hàng đợi quảng bá

Tất cả các thông báo phát sóng được xếp hàng đợi để phát sóng. Nếu bạn muốn định cấu hình kết nối hàng đợi hoặc tên hàng đợi được sử dụng để xếp hàng hoạt động quảng bá, bạn có thể sử dụng các phương thức onConnectionvà onQueuecủa BroadcastMessage:

return (new BroadcastMessage($data))
                ->onConnection('sqs')
                ->onQueue('broadcasts');

 

Tùy chỉnh loại thông báo

Ngoài dữ liệu bạn chỉ định, tất cả các thông báo phát sóng cũng có một typetrường chứa tên lớp đầy đủ của thông báo. Nếu bạn muốn tùy chỉnh thông báo type, bạn có thể xác định một broadcastTypephương thức trên lớp thông báo:

use Illuminate\Notifications\Messages\BroadcastMessage;

/**
 * Get the type of the notification being broadcast.
 *
 * @return string
 */
public function broadcastType()
{
    return 'broadcast.message';
}

 

Nghe thông báo

Thông báo sẽ phát trên một kênh riêng được định dạng theo {notifiable}.{id}quy ước. Vì vậy, nếu bạn đang gửi thông báo đến một App\Models\Userphiên bản có ID là 1, thông báo sẽ được phát trên App.Models.User.1kênh riêng tư. Khi sử dụng Laravel Echo , bạn có thể dễ dàng nghe thông báo trên một kênh bằng notificationphương pháp:

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

 

Tùy chỉnh kênh thông báo

Nếu bạn muốn tùy chỉnh kênh mà thông báo phát sóng của một thực thể được phát trên, bạn có thể xác định một receivesBroadcastNotificationsOnphương pháp trên thực thể đáng tin cậy:

<?php

namespace App\Models;

use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The channels the user receives notification broadcasts on.
     *
     * @return string
     */
    public function receivesBroadcastNotificationsOn()
    {
        return 'users.'.$this->id;
    }
}

 

Thông báo SMS

 

Điều kiện tiên quyết

Gửi thông báo SMS trong Laravel được hỗ trợ bởi Vonage (trước đây gọi là Nexmo). Trước khi có thể gửi thông báo qua Vonage, bạn cần cài đặt gói laravel/nexmo-notification-channelvà Trình nexmo/laravelsoạn thảo

composer require laravel/nexmo-notification-channel nexmo/laravel

Các nexmo/laravelgói bao gồm tập tin cấu hình riêng của mình . Tuy nhiên, bạn không bắt buộc phải xuất tệp cấu hình này sang ứng dụng của riêng mình. Bạn có thể chỉ cần sử dụng các biến NEXMO_KEYvà NEXMO_SECRETmôi trường để đặt khóa công khai và khóa bí mật Vonage của mình.

Tiếp theo, bạn sẽ cần thêm nexmomục cấu hình vào config/services.phptệp cấu hình của mình . Bạn có thể sao chép cấu hình ví dụ bên dưới để bắt đầu:

'nexmo' => [
    'sms_from' => '15556666666',
],

Các sms_fromtùy chọn là số điện thoại mà tin nhắn SMS của bạn sẽ được gửi từ. Bạn nên tạo số điện thoại cho ứng dụng của mình trong bảng điều khiển Vonage.

 

Định dạng thông báo SMS

Nếu thông báo hỗ trợ được gửi dưới dạng SMS, bạn nên xác định một toNexmophương thức trên lớp thông báo. Phương thức này sẽ nhận một $notifiablethực thể và sẽ trả về một Illuminate\Notifications\Messages\NexmoMessagethể hiện:

/**
 * Get the Vonage / SMS representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\NexmoMessage
 */
public function toNexmo($notifiable)
{
    return (new NexmoMessage)
                ->content('Your SMS message content');
}

 

Nội dung Unicode

Nếu tin nhắn SMS của bạn chứa các ký tự unicode, bạn nên gọi unicodephương thức khi xây dựng NexmoMessagephiên bản:

/**
 * Get the Vonage / SMS representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\NexmoMessage
 */
public function toNexmo($notifiable)
{
    return (new NexmoMessage)
                ->content('Your unicode message')
                ->unicode();
}

 

Định dạng thông báo mã ngắn

Laravel cũng hỗ trợ gửi thông báo mã ngắn, là các mẫu tin nhắn được xác định trước trong tài khoản Vonage của bạn. Để gửi thông báo SMS mã ngắn, bạn nên xác định một toShortcodephương thức trên lớp thông báo của mình. Từ bên trong phương pháp này, bạn có thể trả về một mảng quy định cụ thể các loại hình thông báo ( alert2fahoặc marketing) cũng như các giá trị tùy chỉnh mà sẽ cư mẫu:

/**
 * Get the Vonage / Shortcode representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function toShortcode($notifiable)
{
    return [
        'type' => 'alert',
        'custom' => [
            'code' => 'ABC123',
        ],
    ];
}

 

Giống như định tuyến Thông báo SMS , bạn nên triển khai routeNotificationForShortcodephương pháp này trên mô hình thông báo của mình.

 

 

Tùy chỉnh số "Từ"

Nếu bạn muốn gửi một số thông báo từ một số điện thoại khác với số điện thoại được chỉ định trong config/services.phptệp của bạn , bạn có thể gọi fromphương thức trên một NexmoMessageví dụ:

/**
 * Get the Vonage / SMS representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return NexmoMessage
 */
public function toNexmo($notifiable)
{
    return (new NexmoMessage)
                ->content('Your SMS message content')
                ->from('15554443333');
}

 

Định tuyến thông báo SMS

Để định tuyến thông báo Vonage đến số điện thoại thích hợp, hãy xác định một routeNotificationForNexmophương pháp trên thực thể đáng tin cậy của bạn:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * Route notifications for the Nexmo channel.
     *
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return string
     */
    public function routeNotificationForNexmo($notification)
    {
        return $this->phone_number;
    }
}

 

Thông báo Slack

 

Điều kiện tiên quyết

Trước khi có thể gửi thông báo qua Slack, bạn phải cài đặt kênh thông báo Slack qua Composer:

composer require laravel/slack-notification-channel

Bạn cũng sẽ cần phải định cấu hình tích hợp "Webhook đến" cho nhóm Slack của mình. Sự tích hợp này sẽ cung cấp cho bạn một URL mà bạn có thể sử dụng khi định tuyến thông báo Slack .

 

Định dạng thông báo Slack

Nếu một thông báo hỗ trợ được gửi dưới dạng tin nhắn Slack, bạn nên xác định một toSlackphương thức trên lớp thông báo. Phương thức này sẽ nhận một $notifiablethực thể và sẽ trả về một Illuminate\Notifications\Messages\SlackMessagethể hiện. Thư slack có thể chứa nội dung văn bản cũng như "tệp đính kèm" định dạng văn bản bổ sung hoặc một mảng trường. Hãy xem một toSlackví dụ cơ bản :

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\SlackMessage
 */
public function toSlack($notifiable)
{
    return (new SlackMessage)
                ->content('One of your invoices has been paid!');
}

 

Tùy chỉnh Người gửi & Người nhận

Bạn có thể sử dụng fromvà tocác phương pháp để tùy chỉnh người gửi và người nhận. Các fromphương pháp chấp nhận một định danh tên truy cập và biểu tượng cảm xúc, trong khi tophương pháp chấp nhận một kênh hoặc tên thành viên:

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\SlackMessage
 */
public function toSlack($notifiable)
{
    return (new SlackMessage)
                ->from('Ghost', ':ghost:')
                ->to('#bots')
                ->content('This will be sent to #bots');
}

Bạn cũng có thể sử dụng hình ảnh từ "logo" thay vì biểu tượng cảm xúc:

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\SlackMessage
 */
public function toSlack($notifiable)
{
    return (new SlackMessage)
                ->from('Laravel')
                ->image('https://laravel.com/img/favicon/favicon.ico')
                ->content('This will display the Laravel logo next to the message');
}

 

Tệp đính kèm Slack

Bạn cũng có thể thêm "tệp đính kèm" vào tin nhắn Slack. Tệp đính kèm cung cấp các tùy chọn định dạng phong phú hơn so với tin nhắn văn bản đơn giản. Trong ví dụ này, chúng tôi sẽ gửi thông báo lỗi về một ngoại lệ đã xảy ra trong một ứng dụng, bao gồm một liên kết để xem thêm chi tiết về ngoại lệ:

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\SlackMessage
 */
public function toSlack($notifiable)
{
    $url = url('/exceptions/'.$this->exception->id);

    return (new SlackMessage)
                ->error()
                ->content('Whoops! Something went wrong.')
                ->attachment(function ($attachment) use ($url) {
                    $attachment->title('Exception: File Not Found', $url)
                               ->content('File [background.jpg] was not found.');
                });
}

Phần đính kèm cũng cho phép bạn chỉ định một mảng dữ liệu sẽ được hiển thị cho người dùng. Dữ liệu đã cho sẽ được trình bày dưới dạng bảng để dễ đọc:

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return SlackMessage
 */
public function toSlack($notifiable)
{
    $url = url('/invoices/'.$this->invoice->id);

    return (new SlackMessage)
                ->success()
                ->content('One of your invoices has been paid!')
                ->attachment(function ($attachment) use ($url) {
                    $attachment->title('Invoice 1322', $url)
                               ->fields([
                                    'Title' => 'Server Expenses',
                                    'Amount' => '$1,234',
                                    'Via' => 'American Express',
                                    'Was Overdue' => ':-1:',
                                ]);
                });
}

 

Đánh dấu Nội dung Tệp đính kèm

Nếu một số trường phần đính kèm của bạn chứa Markdown, bạn có thể sử dụng markdownphương pháp này để hướng dẫn Slack phân tích cú pháp và hiển thị các trường phần đính kèm đã cho dưới dạng văn bản có định dạng Markdown. Các giá trị được chấp nhận bằng phương pháp này là: pretexttext, và / hoặc fields. Để biết thêm thông tin về định dạng tệp đính kèm Slack, hãy xem tài liệu API Slack :

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return SlackMessage
 */
public function toSlack($notifiable)
{
    $url = url('/exceptions/'.$this->exception->id);

    return (new SlackMessage)
                ->error()
                ->content('Whoops! Something went wrong.')
                ->attachment(function ($attachment) use ($url) {
                    $attachment->title('Exception: File Not Found', $url)
                               ->content('File [background.jpg] was *not found*.')
                               ->markdown(['text']);
                });
}

 

Định tuyến thông báo Slack

Để định tuyến thông báo Slack đến nhóm và kênh Slack thích hợp, hãy xác định một routeNotificationForSlackphương pháp trên thực thể đáng tin cậy của bạn. Thao tác này sẽ trả về URL webhook mà thông báo sẽ được gửi đến. URL Webhook có thể được tạo bằng cách thêm dịch vụ "Webhook đến" vào nhóm Slack của bạn:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * Route notifications for the Slack channel.
     *
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return string
     */
    public function routeNotificationForSlack($notification)
    {
        return 'https://hooks.slack.com/services/...';
    }
}

 

Bản địa hóa thông báo

Laravel cho phép bạn gửi thông báo bằng ngôn ngữ khác với ngôn ngữ hiện tại của yêu cầu HTTP và thậm chí sẽ nhớ ngôn ngữ này nếu thông báo được xếp hàng đợi.

Để thực hiện điều này, Illuminate\Notifications\Notificationlớp cung cấp một localephương thức để đặt ngôn ngữ mong muốn. Ứng dụng sẽ thay đổi thành ngôn ngữ này khi thông báo đang được đánh giá và sau đó hoàn nguyên về ngôn ngữ trước đó khi quá trình đánh giá hoàn tất:

$user->notify((new InvoicePaid($invoice))->locale('es'));

Bản địa hóa của nhiều mục được chú ý cũng có thể đạt được thông qua Notificationmặt tiền:

Notification::locale('es')->send(
    $users, new InvoicePaid($invoice)
);

 

Ngôn ngữ ưa thích của người dùng

Đôi khi, các ứng dụng lưu trữ ngôn ngữ ưa thích của mỗi người dùng. Bằng cách thực hiện HasLocalePreferencehợp đồng trên mô hình đáng tin cậy của bạn, bạn có thể hướng dẫn Laravel sử dụng ngôn ngữ được lưu trữ này khi gửi thông báo:

use Illuminate\Contracts\Translation\HasLocalePreference;

class User extends Model implements HasLocalePreference
{
    /**
     * Get the user's preferred locale.
     *
     * @return string
     */
    public function preferredLocale()
    {
        return $this->locale;
    }
}

Khi bạn đã triển khai giao diện, Laravel sẽ tự động sử dụng ngôn ngữ ưa thích khi gửi thông báo và mailables tới mô hình. Do đó, không cần gọi localephương thức khi sử dụng giao diện này:

$user->notify(new InvoicePaid($invoice));

 

Sự kiện thông báo

Khi một thông báo được gửi đi, Illuminate\Notifications\Events\NotificationSent sự kiện sẽ được kích hoạt bởi hệ thống thông báo. Điều này chứa thực thể "notifiable" và bản thân trường hợp thông báo. Bạn có thể đăng ký người nghe cho sự kiện này trong EventServiceProvider:

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

 

Sau khi đăng ký trình nghe trong của bạn EventServiceProvider, hãy sử dụng event:generatelệnh Artisan để tạo nhanh các lớp trình nghe.

 

Trong vòng một người biết lắng nghe sự kiện, bạn có thể truy cập notifiablenotificationchannel, và responsetài sản trên sự kiện này để tìm hiểu thêm về địa chỉ nhận thông báo hoặc thông báo riêng của mình:

/**
 * Handle the event.
 *
 * @param  \Illuminate\Notifications\Events\NotificationSent  $event
 * @return void
 */
public function handle(NotificationSent $event)
{
    // $event->channel
    // $event->notifiable
    // $event->notification
    // $event->response
}

 

Kênh tùy chỉnh

Laravel cung cấp một số kênh thông báo, nhưng bạn có thể muốn viết trình điều khiển của riêng mình để gửi thông báo qua các kênh khác. Laravel làm cho nó trở nên đơn giản. Để bắt đầu, hãy xác định một lớp có chứa một sendphương thức. Phương thức sẽ nhận được hai đối số: a $notifiablevà a $notification.

Trong sendphương thức, bạn có thể gọi các phương thức trên thông báo để truy xuất đối tượng tin nhắn mà kênh của bạn hiểu và sau đó gửi thông báo đến phiên bản theo cách $notifiablebạn muốn:

<?php

namespace App\Channels;

use Illuminate\Notifications\Notification;

class VoiceChannel
{
    /**
     * Send the given notification.
     *
     * @param  mixed  $notifiable
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return void
     */
    public function send($notifiable, Notification $notification)
    {
        $message = $notification->toVoice($notifiable);

        // Send notification to the $notifiable instance...
    }
}

Khi lớp kênh thông báo của bạn đã được xác định, bạn có thể trả lại tên lớp từ viaphương thức của bất kỳ thông báo nào của bạn. Trong ví dụ này, toVoicephương thức thông báo của bạn có thể trả về bất kỳ đối tượng nào bạn chọn để đại diện cho tin nhắn thoại. Ví dụ: bạn có thể xác định VoiceMessagelớp của riêng mình để đại diện cho các thông báo sau:

<?php

namespace App\Notifications;

use App\Channels\Messages\VoiceMessage;
use App\Channels\VoiceChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification
{
    use Queueable;

    /**
     * Get the notification channels.
     *
     * @param  mixed  $notifiable
     * @return array|string
     */
    public function via($notifiable)
    {
        return [VoiceChannel::class];
    }

    /**
     * Get the voice representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return VoiceMessage
     */
    public function toVoice($notifiable)
    {
        // ...
    }
}
» Tiếp: Ủy quyền (Authorization)
« Trước: Sự kiện (Events)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!