Tìm kiếm bài viết

Laravel: Tìm hiểu về Notifications (Phần 1)

01.09.2020

0/5 (0 Reviews)

Laravel: Tìm hiểu về Notifications trong Laravel (Bài 1), cùng thiết kế website bằng Laravel nào. Thông báo đẩy tối ưu hoá SEO cho bạn

    Thông báo đẩy hay còn gọi tiếng anh là Notifications, nhưng các bạn có biết hiểu quả mà nó mang lại như thế nào không? Việc đẩy thông báo cho những người quan tâm và cho phép từ website, thì khi họ không truy cập vào website chúng ta vẫn có thể đẩy thông báo về thiết bị của họ 1 cách dễ dàn, tăng hiệu xuất SEO cho các bạn đang thiết kế website liên quan đến bán hàng, bất động sản, hay thương mại điện tử.

    Bài viết bên dưới được tổng hợp lại từ nhiều người trên internet, cảm ơn bạn đã dịch bài viết, nếu bài viết bên dưới có nhắc đến nội dung của bạn, chân thành cảm ơn. Bài viết này nhằm mục đích chia sẻ kiến thức phi thương mại.

    Giới thiệu về thông báo đẩy bằng Laravel

    Ngoài việc hỗ trợ , Laravel còn cung cấp gửi thông báo qua nhiều kênh, gồm mail, SMS (qua ), và . Thông báo có thể được lưu trong cơ sở dữ liệu và nó có thể hiển thị trên webiste.

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

    Tạo thông báo đẩy như thế nào?

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

    php artisan make:notification InvoicePaid
    

    Lệnh này sẽ thêm một class trong thư mục app/Notifications. Mỗi class notification chưa một phương thức via và một biến số thông báo của phương thức (như là toMail hoặc toDatabase) chuyển thông báo thành nội dung tối ưu nó cho các channel.

    Gửi thông báo sử dụng Notifiable Trait

    Notification có thể được gửi thông qua 2 cách: sử dụng phương thức notify của Notifiable trait hoặc sử dụng Notification . Đầu tiên, hãy xem cách sử dụng trait:

    <?php
    
    namespace App;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use Notifiable;
    }
    

    Trait này được sử dụng mặc định bởi App\User model và chứa một phương pháp có thể được sử dụng để gửi thông báo: notify. Phương thức notify dự kiến sẽ nhận được một instance notification:

    use App\Notifications\InvoicePaid;
    
    $user->notify(new InvoicePaid($invoice));
    

    Sử dụng Notification Facade

    Ngoài ra, bạn có thể gửi thông báo qua Notification . Nó sẽ hữu ích khi bạn cần gửi một thông báo đến nhiềunotifiable entities như một collection của người dùng. Để gửi thông báo sử dụng facade, truyền tất cả các notifiable entities và thông báo vào phương thức send:

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

    Specifying Delivery Channels

    Mọi class notification có một phương thức via để xác định kênh thông báo sẽ được chuyển đi. Thông báo có thể được gửi qua các kênh mail, database, broadcast, nexmo, và slack. Phương thức via nhận một $notifiable instance, là thể hiện của class đang được gửi đi. Bạn có thể dùng $notifiable để xác định kênh thông báo được phục vụ:

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

    Gửi lần lược trong Notifications

    Gửi thông báo có thể mất thời gian, đặc biệt nếu kênh cần một API ngoài để gọi phục vụ thông báo. Để tăng tốc ứng dụng của bạn, hãy đặt nó vào queue bằng cách thêm ShouldQueue interface và Queueable trait đến class của bạn. Interface và trait được thêm vào tất cả các thông báo được tạo ra sử dụng lệnh make:notification, vì vậy bạn có thể trực tiếp thêm chúng vào trong class notification:

    <?php
    
    namespace App\Notifications;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Contracts\Queue\ShouldQueue;
    
    class InvoicePaid extends Notification implements ShouldQueue
    {
        use Queueable;
    
        // ...
    }
    

    Mỗi ShouldQueue interface đượ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ẽ detect ShouldQueue interface trong class và tự động queue để chuyển thông báo:

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

    Nếu bạn muốn hoãn thông báo, bạn có thể chain phương thức delay vào trong instantiation notification của bạn:

    $when = now()->addMinutes(10);
    
    $user->notify((new InvoicePaid($invoice))->delay($when));
    

    On-Demand Notifications

    Đội khi, bạn có thể cần phải gửi thông báo cho người không phải là người sử dụng ứng dụng của bạn. Sử dụng phương thức Notification::route, bạn có thể chỉ định thông tin định tuyến thông báo ad-hoc trước khi gửi thông báo:

    Notification::route('mail', '')
                ->route('nexmo', '5555555555')
                ->notify(new InvoicePaid($invoice));
    

    Gửi thông báo qua Email

    Formatting Mail Messages

    Nếu một thông báo được gửi bằng email, bạn nên định nghĩa một phương thức toMail trong class notification. Phương thức này sẽ nhận một $notifiable entity và nên trả về một Illuminate\Notifications\Messages\MailMessage instance. Nội dung mail có thể chứa nhiều dòng text như "call to action". Hãy xem một ví dụ về phương thức ``toMail``` như bên dưới:

    /**
     * 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!');
    }
    

    Trong ví dụ này, chúng ta đăng ký một lời chào, một dòng text, một hành động, và một dòng text khác. Phương thức này cung cấp bởi MailMessage object làm nó đơn giản và nhanh để format transactional emails nhỏ. Kênh mail sẽ được dịch nội dung có css cho bạn, responsive HTML email template với một bản sao plain-text. Đây là một ví dụ tạo email bởi kênh mail:

    Other Notification Formatting Options

    Thay vì xác định "lines"của văn bản trong class notification, bạn có thể sử dụng phương thức view để chỉ định một mẫu tùy chỉnh cần đượ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]
        );
    }
    

    Ngoài ra, bạn có thể trả về một từ phương thức toMail:

    use App\Mail\InvoicePaid as Mailable;
    
    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return Mailable
     */
    public function toMail($notifiable)
    {
        return (new Mailable($this->invoice))->to($this->user->email);
    }
    

    Error Messages 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ông báo mail là liên quan đến một lỗi bằng cách gọi cho các phương thức error khi xây dựng tin nhắn của bạn. Khi sử dụng phương thức ```error`` trên email message, nút gọi hành động sẽ là màu đỏ thay vì màu xanh lam:

    /**
     * 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('...');
    }
    

    Customizing The Recipient

    Khi gửi thông báo qua kênh mail, thông báo hệ thống sẽ tự động tìm thuộc tính email trong notifiable entity. Bạn có thể tùy biến email được sử dụng để gửi thông báo bằng cách định nghĩa một phương thức routeNotificationForMail trên entity:

    <?php
    
    namespace App;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use Notifiable;
    
        /**
         * Route notifications for the mail channel.
         *
         * @return string
         */
        public function routeNotificationForMail()
        {
            return $this->email_address;
        }
    }
    

    Thay đổi chỉnh sửa tiêu đề

    Mặc định, subject của mail trong tên class của thông báo có dạng "title case". Vì vậy, nếu tên class notification của bạn là InvoicePaid, subject của mail sẽ là Invoice Paid. Nếu bạn muốn thay đổi, bạn có thể gọi phương thức subject khi xây dựng nội dung:

    /**
     * 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('...');
    }
    

    Customizing The Templates

    Bạn có thể chỉnh sửa HTML và plain-text template được sử dụng bởi mail thông báo bằng cách publishing gói thông báo resources. Sau khi chạy lệnh này, templates mail thông báo sẽ nằm tại resources/views/vendor/notifications:

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

    Gửi mail thông báo dạng Markdown

    Markdown mail notification cho phép bạn tận dụng lwoij thế của các mẫu được tạo sẵn của thông báo qua mail. đồng thời cho phép bạn tự do viết thư dài hơn, tùy chỉnh. Khi message được viết trong Markdown, Laravel có thể render dẹp hơn, reponsive HTML template cho các message trong khi cũng tự động generate một plain-text.

    Generating The Message

    Để tạo một thông báo với mẫu Markdown tương ứng, bạn có thể sử dụng option --markdown của câu lệnh Artisan make:notification:

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

    Giống như tất cả các mail notification, các thông báo sử dụng Markdown template nên định nghĩa một phương thức toMail trên class notification. Tuy nhiên, thay vì sử dụng phương thức lineaction để constrcut notification, sử dụng phương thức markdown để chỉ định tên của Markdown template được sử dụng

    /**
     * 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]);
    }
    

    Writing The Message

    Markdown mail notification sử dụng kết hợp các thành phần của Blade component và Markdown systax cho phép bạn dễ dàng xây dựng các thông báo trong khi tận dụng được các thành phần pre-crafted notification components 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
    

     

    Button Component Button component render một centered button link. Các component nhận 2 đối số, một url và ` option color. Các màu được hỗ trợ là blue, greenred. Bạn có thể thêm nhiều button component đến một notification như bạn muốn:

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

    Panel Component

    Table component cho phép bạn chuyển đổi một Markdown table thành một HTML table. Các component chấp nhận Markdown table làm nội dung của nó. Căn lề table được hỗ trợ bằng cách sử dụng cú pháp căn chỉnh Markdown table mặc định:

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

    Customizing The Components

    Bạn có thể export tất cả các Markdown notification component vào ứng dụng của bạn để tùy chỉnh. Để export các component, sử dụng câu lệnh Artisan vendor:publish để publish laravel-mail aset tag:

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

    Lệnh này sẽ publish các Markdown mail component tới thư mục resources/views/vendor/mail. Thư mục mail sẽ chứa một html và một thư mục markdown, mỗi tệp chứa các biểu diễn tương ứng của mỗi component có sẵn. Bạn được tự do tùy biến các component này theo ý mình.

    Chúc các bạn học tốt.

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    Kubernetes bài 6 - Vận hành k8s Day-Two Operations và Quản trị bằng GitOps

    22.05.2026

    Khi cụm Kubernetes của bạn đã được bảo mật cấu hình, tối ưu tài nguyên và thiết lập tự phục hồi, câu hỏi đặt ra là làm sao để duy trì sự ổn định đó trong nhiều năm tiếp theo mà không bị phụ thuộc

    thumbnail

    Kubernetes bài 5 - bảo mật Cloud Native và chuẩn DevSecOps cho K8s

    22.05.2026

    Việc siết chặt an ninh (Hardening) không phải là cấu hình một vài thông số rồi bỏ đó, mà là một tư duy phòng thủ chiều sâu.

    thumbnail

    Kubernetes bài 4 - Tối ưu Resource Auto-Healing và Scale Zero-Downtime

    22.05.2026

    Bài viết này sẽ đi sâu vào các cơ chế ở tầng Kernel giúp hệ thống tự phục hồi, chống lại các đợt tấn công cạn kiệt tài nguyên và cập nhật phiên bản mới mà người dùng không hề hay biết.

    thumbnail

    Kubernetes bài 3 - Bảo mật cấu hình k8s và config Security trên Production

    22.05.2026

    Kubernetes giải quyết bài toán này bằng hai đối tượng chuyên biệt nhưng nếu không hiểu rõ bản chất bảo mật ở tầng dưới, bạn đang tự tay dâng toàn bộ chìa khóa hệ thống cho hacker.

    thumbnail

    Kubernetes bài 2 - Mạng lưới k8s và luồng Traffic ở Packet Level

    22.05.2026

    Pod không chỉ là một container: Rất nhiều người nhầm lẫn Pod 1-1 với Container. Thực chất, Pod là đơn vị triển khai nhỏ nhất, có thể chứa một hoặc nhiều container

    Mục lục bài viết