Laravel - Digging Deeper - Notifications

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。




# Creating Notifications

Laravel Notifications 中, 如果我要使用 CLI 建立 notification, 可以怎麼做?
php artisan make:notification NotificationName




# Sending Notifications

# Using The Notifiable Trait

Laravel Notifications 中, 要發送一個 notification 有哪兩種方式?
  • Notifiable trait
  • Notification facade
Laravel Notifications 中, 哪個 model 預設就有使用 Notifiable trait?

User model

Laravel Notifications 中, Notifiable trait 可以使用在哪些 model 上?

每一個 model

Laravel Notifications 中, 假設我在 User model 使用 Notifiable trait, 現在我要發送 notification InvoicePaid($invoice), 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    use App\Notifications\InvoicePaid;

    $user->這裡是?;
  • Answer:

    <?php
    use App\Notifications\InvoicePaid;

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


# Using The Notification Facade

Laravel Notifications 中, 什麼情境下比較適合使用 Notification Facade?

當我要發送 notification 給多個對象時

Laravel Notifications 中, 在以下的 example 中, 如果要使用 Notification facade 來發送 notification 給多個 user, 可以怎麼做?
  • Example:

    <?php
    Notification::這裡是?($users, new InvoicePaid($invoice));
  • Answer:

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


# Specifying Delivery Channels

Laravel Notifications 中, 哪一個 method 決定 notification 要以什麼樣的形式被傳送, 例如 mail, 或 slack 等等…

via method

Laravel Notifications 中, 哪個網站可以看到 notification 支援 channel 總表?

這裏

解釋以下 Laravel Notification example
  • Example:

    <?php
    public function via($notifiable)
    {
    return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
    }
  • Answer:
    如果 $notifiable 的 attribute prefers_sms 為 true, 則經由 nexmo 發送, 否則則經由 mail 以及 database

Laravel Notifications 中, $notifiable 代表?

Notification 要發送到的 instance, 例如我要發送到指定 user, 那 $notifiable 就代表該 user model


# Queueing Notifications

Laravel Notifications 中, 如果我要 queue 該 notification, 在以下的 example 中可以怎麼做?
  • Example:

    <?php

    namespace App\Notifications;

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

    class InvoicePaid extends Notification implements 這邊要 implements 哪個 interface?
    {
    use Queueable;

    // ...
    }
  • Answer:

    <?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;

    // ...
    }
Laravel Notifications 中, 如果我要 queue 一個 notification, 我可以 implement ShouldQueue class 以及使用 Queueable Trait, 分別的功能是?
  • ShouldQueue Interface 會 queue 該 notification
  • Queueable Trait 讓該 notification 可以使用該 Trait 的 function
Laravel Notifications 中, 如果我想要 delay 一段時間之後再發送該 notification, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    $when = now()->addMinutes(10);

    $user->notify((new InvoicePaid($invoice))->這裏該使用?);
  • Answer:

    <?php
    $when = now()->addMinutes(10);

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


# On-Demand Notifications

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    Notification::route('mail', 'ray@example.com')
    ->route('nexmo', '3333')
    ->notify(new InvoicePaid($invoice));
  • Answer:
    使用 Notification class 的 route method, 可指定 channel 以及接收方並傳送, 儘管接收方並不存在於 database




# Mail Notifications

# Formatting Mail Messages

Laravel Notifications 中, 如果 notification 會以 mail 的形式被傳送, 那我需要再 Notification class 中使用 哪一個 method 來定義 mail 內容?

toMail method

Laravel Notifications 中, 在以下的 example 中, toMail method 中需要 return 哪一個 instance?
  • Example:

    <?php
    /**
    * 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 (這裏是哪個 instance?)
    ->greeting('Hello!')
    ->line('One of your invoices has been paid!')
    ->action('View Invoice', $url)
    ->line('Thank you for using our application!');
    }
  • Answer:

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


# Other Notification Formatting Options

Laravel Notifications 中, 除了使用 lines 語法在 toMail method 裡頭定義 mail 格式外, 如果我想要使用 template 來定義, 可以使用 MailMessage 的哪一個 method?

view method

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)->view(
    'emails.name', ['invoice' => $this->invoice]
    );
    }
  • Answer:
    在 notification 的 tiMail() 中, 使用 MailMessage class 的 view(), 以 template 來定義 mail 格式以及內容

Laravel Notifications 中, 在 toMail method 中, 可以使用哪幾種方式來定義 mail 內容或格式?
  • greeting 等等的 syntax
  • view
  • mailable class
  • markdown


# Error Messages

Laravel Notifications 中, 如果說我 mail 的內容是 error 相關的, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    /**
    * Get the mail representation of the notification.
    *
    * @param mixed $notifiable
    * @return \Illuminate\Notifications\Message
    */
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->這裏該使用?()
    ->subject('Notification Subject')
    ->line('...');
    }
  • Answer:

    <?php
    /**
    * 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 Sender

Laravel Notifications 中, 預設的 mail sender 定義在哪個檔案中

config/mail.php

Laravel Notifications 中, 預設的 mail sender 定義 config/mail.php 中, 如果我要自定義, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    /**
    * Get the mail representation of the notification.
    *
    * @param mixed $notifiable
    * @return \Illuminate\Notifications\Messages\MailMessage
    */
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->這裡是哪個 mehtod?('test@example.com', 'Example')
    ->line('...');
    }
  • Answer:

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


# Customizing The Recipient

Laravel Notifications 中, 當寄送 mail 時, 預設會去尋找 notifiable 的哪個 property, 也可能就是 table 中的哪個欄位?

email column

Laravel Notifications 中, 當寄送 mail 時, 預設會去尋找 notifiable 的 email property, 如果我不想使用 email, 我要自定義成 email_address, 那我可以在 notifiable 中使用哪一個 method??

routeNotificationForMail method

Laravel Notifications 中, 當寄送 mail 時, 預設會去尋找 notifiable 的 email property, 如果我不想使用 email, 我要自定義成 email_address, 在以下的 example 中可以怎麼做??
  • Example:

    <?php

    namespace App;

    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)
    {
    // 這裏要回傳?
    }
    }
  • Answer:

    <?php

    namespace App;

    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;
    }
    }
Laravel Notifications 中, 當寄送 mail 時, 預設會去尋找 notifiable 的 email property, 如果我不想使用 email, 我要自定義成 email_address, 並且回傳 email_address => user_name 的形式, 那我可以怎麼做?
  • Example:

    <?php

    namespace App;

    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)
    {
    // 這裏要回傳?
    }
    }
  • Answer:

    <?php

    namespace App;

    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 name and email address...
    return [$this->email_address => $this->name];
    }
    }


# Customizing The Subject

Laravel Notifications 中, 當我使用 mail 發送 notification 時, 預設 subject 是什麼?

class name, 如果 class 是 InvoicePaid, subject 就是 Invoice Paid

Laravel Notifications 中, 當我使用 mail 發送 notification 時, 預設 subject 是 class name, 如果我要自定義的話, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->這裏是?('Notification Subject')
    ->line('...');
    }
  • Answer:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->subject('Notification Subject')
    ->line('...');
    }


# Customizing The Mailer

Laravel Notifications 中, 當我使用 email 發送 notification 時, 預設使用 config/mail.php 當中的 driver 為 mailer, 如果我要自定義的話, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->這裏是?('postmark')
    ->line('...');
    }
  • Answer:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->mailer('postmark')
    ->line('...');
    }


# Customizing The Templates

Laravel Notifications 中, 如果我要藉由發布 notification package 資源來修改 HTML 以及 plain-text template 的話, 可以使用哪個 CLI?
php artisan vendor:publish --tag=laravel-notifications


# Previewing Mail Notifications

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    Route::get('mail', function () {
    $invoice = App\Invoice::find(1);

    return (new App\Notifications\InvoicePaid($invoice))
    ->toMail($invoice->user);
    });
  • Answer:
    將 InvoicePaid 這個 notification 在 Mail 上是如何顯示的 return 到瀏覽器, 以供確認以及測試




# Markdown Mail Notifications

# Generating The Message

Laravel Notifications 中, 如果我要建立一個 notification 名為 InvoicePaid, 並伴隨一個 markdown template 位於 mail/invoice/paid, 可以使用哪個 CLI?
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
Laravel Notifications 中, 如果我要使用 markdown template 來定義我的 mail 格式內容, 在以下的 example 中該怎麼做?
  • Example:

    <?php
    public function toMail($notifiable)
    {
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
    ->subject('Invoice Paid')
    ->這裏是?('mail.invoice.paid', ['url' => $url]);
    }
  • Answer:

    <?php
    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

# Button Component

Laravel Notifications 中, 如果我需要一個 mail 中的 button, 在以下的 example 中, 可以使用什麼 component?
  • Example:

    <?php
    @component('這裏是?', ['url' => $url, 'color' => 'green'])
    View Invoice
    @endcomponent
  • Answer:

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


# Panel Component

Laravel Notifications 中, 當我使用 markdown 來定義 mail 內容格式時, 如果我想要一個區塊中的背景顏色不同, 藉此凸顯區塊內的文字, 那我可以使用哪個 component?
  • Example:

    <?php
    @component('這裏是?')
    This is the panel content.
    @endcomponent
  • Answer:

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


# Table Component

Laravel Notifications 中, 如果當我使用 markdown 來定義 mail 內容及格式時, 我想要使用 table, 那我可以使用哪個 component?
  • Example:

    <?php
    @component('這裏是?')
    | Laravel | Table | Example |
    | ------------- |:-------------:| --------:|
    | Col 2 is | Centered | $10 |
    | Col 3 is | Right-Aligned | $20 |
    @endcomponent
  • Answer:

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


# Customizing The Components

Laravel Notifications 中, 如果我想要客製化 mail 的 markdown, 我可以使用哪個 CLI 來匯出檔案?
php artisan vendor:publish --tag=laravel-mail
Laravel Notifications 中, 當我使用以下的 CLI 來匯出 component 的 source 檔時, 會匯出到哪個資料夾?

resources/views/vendor/mail


# Customizing The CSS

Laravel Notifications 中, 如果我要自定義一個 mail markdown 的 theme, 可以在哪個資料夾中定義新的 css 檔案?

resources/views/vendor/mail/html/themes

Laravel Notifications 中, 如果我在 resources/views/vendor/mail/html/themes 資料夾中自己定義了一個 css 檔案, 接下來我必須要修改哪個檔案的設定來讓他生效?

config/mail.php

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->theme('invoice')
    ->subject('Invoice Paid')
    ->markdown('mail.invoice.paid', ['url' => $url]);
    }
  • Answer:

    <?php
    // 使用 toMail method 來定義 to mail 格式
    public function toMail($notifiable)
    {
    return (new MailMessage)
    // 指定 theme, 位於 `resources/views/vendor/mail/html/themes` 資料夾, invoice.css 檔案, 若不指定會使用 default.css
    ->theme('invoice')
    // Mail 主題
    ->subject('Invoice Paid')
    // markdown 模板, 帶 url 參數過去
    ->markdown('mail.invoice.paid', ['url' => $url]);
    }




# Database Notifications

# Prerequisites

Laravel Notifications 中, 什麼是 database notification?

將 notification 儲存於 database table

Laravel Notifications 中, 如果我要使用 CLI 建立一個 notification table, 該怎麼做?
php artisan notifications:table
php artisan migrate


# Formatting Database Notifications

Laravel Notifications 中, 當我使用 database notification 時, 可使用哪個 method 來定義回傳資料?
  • toArray() method
  • toDatabase() method
Laravel Notifications 中, 如果我在我的 notification 當中同時使用了 database 以及 broadcast, 那針對 database notification 我該使用哪個 method 來定義其內容?

toDatabase method

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 的回傳格式必須是?

array

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 回傳值會被以什麼格式存在 data column?

JSON

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 回傳值會被以 JSON 格式存在哪一個 column?

data

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 的參數該是?
  • Example:

    <?php
    public function toArray(這裏是?)
    {
    return [
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ];
    }
  • Answer:

    <?php
    public function toArray($notifiable)
    {
    return [
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ];
    }


# Accessing The Notifications

Laravel Notifications 中, 如果我要從 notifiable model 來存取 notification data, 我可以使用哪一個 trait?

Illuminate\Notifications\Notifiable trait

Laravel Notifications 中, notification 預設會以什麼排序?

created_at

Laravel Notifications 中, 以下 example 中如果我要取得 unreadNotifications, 可以怎麼做?
  • Example:

    <?php
    $user = App\User::find(1);

    foreach ($user->這裏是? as $notification) {
    echo $notification->type;
    }
  • Answer:

    <?php
    $user = App\User::find(1);

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


# Marking Notifications As Read

Laravel Notifications 中, 以下 example 中如果我要標記特定 notification 為已讀, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    $user = App\User::find(1);

    foreach ($user->unreadNotifications as $notification) {
    $notification->這裏是?();
    }
  • Answer:

    <?php
    $user = App\User::find(1);

    foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
    }
Laravel Notifications 中, 當我使用 markAsRead() method 時, 可以使用在 collection 上嗎?

Laravel Notifications 中, 如果我想要刪除對應的 database notification, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    $user->notifications()->這裏是?();
  • Answer:

    <?php
    $user->notifications()->delete();




# Broadcast Notifications

# Formatting Broadcast Notifications

Laravel Notifications 中, 如果我使用 event broadcasting 來發送 notification, 該使用哪個 method?

toBroadcast method

Laravel Notifications 中, 如果我使用 event broadcasting 來發送 notification, 當 toBroadcast method 不存在於, Laravel 會使用哪個 method??

toArray method

Laravel Notifications 中, 如下 example, toBroadcast method 應該要回傳哪一個 class 的 instance?
  • Example:

    <?php
    public function toBroadcast($notifiable)
    {
    return new 這裏是?([
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ]);
    }
  • Answer:

    <?php
    public function toBroadcast($notifiable)
    {
    return new BroadcastMessage([
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ]);
    }


# Broadcast Queue Configuration

Laravel Notifications 中, 如下 example, 如果我要指定 connection 以及 queue, 該怎麼做?
  • Example:

    <?php
    return (new BroadcastMessage($data))
    ->這裏是?('sqs')
    ->這裏是?('broadcasts');
  • Answer:

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


# Customizing The Notification Type

Laravel Notifications 中, 如果我使用 event broadcasting 來發送 notification, 如果我要自定義 notification type 時, 以下 example 中可以怎麼做?
  • Example:

    <?php
    use Illuminate\Notifications\Messages\BroadcastMessage;
    public function 這裏是?()
    {
    return 'broadcast.message';
    }
  • Answer:

    <?php
    use Illuminate\Notifications\Messages\BroadcastMessage;
    public function broadcastType()
    {
    return 'broadcast.message';
    }


# Listening For Notifications

Laravel Notifications 中, 當我使用 notification broadcast 時, 假設我的 channel 為 App\User, id 為 1, 那以下 example 中, channel name 是?
  • Example:

    <?php
    Echo.private(這裏是?)
    .notification((notification) => {
    console.log(notification.type);
    });
  • Answer:

    <?php
    Echo.private('App.User.' + userId)
    .notification((notification) => {
    console.log(notification.type);
    });
Laravel Notifications 中, 當我使用 notification broadcast 時, 以下 example 中, method 是?
  • Example:

    <?php
    Echo.private('App.User.' + userId)
    .這裏是?((notification) => {
    console.log(notification.type);
    });
  • Answer:

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


# Customizing The Notification Channel

Laravel Notifications 中, 如果我要在 notifiable entity 當中自定義 Broadcast notification 要廣播到的 channel, 以下的 example 中可以怎麼做?
  • Example:

    <?php
    namespace App;

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

    class User extends Authenticatable
    {
    use Notifiable;

    public function 這裏是?()
    {
    return 'users.'.$this->id;
    }
    }
  • Answer:

    <?php
    namespace App;

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

    class User extends Authenticatable
    {
    use Notifiable;

    public function receivesBroadcastNotificationsOn()
    {
    return 'users.'.$this->id;
    }
    }




# SMS Notifications

# Prerequisites

Laravel Notifications 中, 當我要使用 Nexmo 來發送 SMS notification 時, 要先安裝什麼?

Nexmo 套件

composer require laravel/nexmo-notification-channel

Laravel Notifications 中, 當我使用 Nexmo 來發送 SMS notification 時, 需在哪個檔案中定義發送端的號碼?

config/services.php

Laravel Notifications 中, 當我使用 Nexmo 來發送 SMS notification 時, 如何在 config/services.php 中定義發送端號碼?
<?php
'nexmo' => [
'sms_from' => '15556666666',
],


# Formatting SMS Notifications

Laravel Notifications 中, 如果使用 SMS notification 的話, notification class 中該使用哪一個 method 來定義內容?

toNexmo method

Laravel Notifications 中, 如果使用 SMS notification 的話, toNexmo method 中該 return 哪個 class 的 instance, 如下 example?
  • Example:

    <?php
    public function toNexmo($notifiable)
    {
    return (new 這裏是?)
    ->content('Your SMS message content');
    }
  • Answer:

    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your SMS message content');
    }


# Formatting Shortcode Notifications

Laravel Notifications 中, 什麼是 shortcode notification?

Nexmo 帳號中事先定義好的模板

Laravel Notifications 中, 如果我要使用 shotcode notification, 該使用哪個 method?

toShartcode method

Laravel Notifications 中, shortcode notification 有哪幾種 type?
  • alert
  • 2fa
  • marketing
Laravel Notifications 中, 當使用 shortcode notification 時, 需要在 notifiable model 當中定義哪個 method 來定義接收方?

routeNotificationForShortcode method


# Unicode Content

Laravel Notifications 中, 當使用 Nexmo notification 時, 如果我的 SMS 內容含有 unicode, 在以下的 example 中, 該使用哪個 method?
  • Example:

    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your unicode message')
    ->這裏是?();
    }
  • Answer:

    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your unicode message')
    ->unicode();
    }


# Customizing The “From” Number

Laravel Notifications 中, 當使用 Nexmo notification 時, 預設的傳送人號碼被定義在哪?

config/services.php

Laravel Notifications 中, 當使用 Nexmo notification 時, 如果我不使用預設定義在 config/services.php 的傳送人號碼, 在以下的 example 中, 可以怎麼做?
  • Example:

    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your SMS message content')
    ->這裏是?('15554443333');
    }
  • Answer:

    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your SMS message content')
    ->from('15554443333');
    }


# Routing SMS Notifications

Laravel Notifications 中, 當我使用 Nexmo notification 時, 該在 Notifiable model 當中的哪一個 method 定義接收方的號碼? 如下 example
  • Example:

    <?php

    namespace App;

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

    class User extends Authenticatable
    {
    use Notifiable;

    public function 這裏是?($notification)
    {
    return $this->phone_number;
    }
    }
  • Answer:

    <?php

    namespace App;

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

    class User extends Authenticatable
    {
    use Notifiable;

    public function routeNotificationForNexmo($notification)
    {
    return $this->phone_number;
    }
    }




# Slack Notifications

# Prerequisites

Laravel Notifications 中, 若要使用 Slack notification, 需要另外安裝套件嗎?

要哦

composer require laravel/slack-notification-channel


# Formatting Slack Notifications

Laravel Notifications 中, 當我使用 Slack notification 時, 該在 notification class 當中使用哪一個 method 來定義格式跟內容?

toSlack method

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    public function toSlack($notifiable)
    {
    return (new SlackMessage)
    ->from('Laravel', 'emoji')
    ->to('username or channel')
    ->image('https://laravel.com/img/favicon/favicon.ico')
    ->content('This will display the Laravel logo next to the message');
    }
  • Answer:

    <?php
    // 使用 toSlack method 來定義格式內容
    public function toSlack($notifiable)
    {
    return (new SlackMessage)
    // 寄件方的名字, emoji
    ->from('Laravel', 'emoji')
    // 收件方 username 或 channel
    ->to('username or channel')
    // 寄件方 logo
    ->image('https://laravel.com/img/favicon/favicon.ico')
    // 內文
    ->content('This will display the Laravel logo next to the message');
    }


# Slack Attachments

Laravel Slack Notifications 中, 當我想使用更豐富的格式選項, 如下圖, 在以下的 example 中, 可以怎麼做?
  • Picture:

  • Example:

    <?php
    public function toSlack($notifiable)
    {
    $url = url('/exceptions/'.$this->exception->id);

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

    <?php
    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.');
    });
    }
Laravel Slack Notifications 中, 如果我想要達到 table 的效果, 如下圖, 在以下 example 中可以怎麼做?
  • Picture:
  • Example:

    <?php
    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)
    ->這裏是?([
    'Title' => 'Server Expenses',
    'Amount' => '$1,234',
    'Via' => 'American Express',
    'Was Overdue' => ':-1:',
    ]);
    });
    }
  • Answer:

    <?php
    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:',
    ]);
    });
    }


# Markdown Attachment Content

Laravel Slack Notifications 中, 如果我要在 attachment 當中使用 markdown 語法, 在以下的 example 中該怎麼做?
  • Example:

    <?php
    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*.')
    ->這裏是?(['text']);
    });
    }
  • Answer:

    <?php
    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']);
    });
    }
Laravel Slack Notifications 中, 有關 markdown format 的詳細資訊, 可以參考?

Slack API Document


# Routing Slack Notifications

Laravel Slack Notifications 中, notifiable entity 中的 routeNotificationForSlack 應該要 return 什麼?

webhook URL

Laravel Slack Notifications 中, 該在 notifiable entity 當中使用哪個 method 來定義接收方?

routeNotificationForSlack method




# Localizing Notifications

Laravel Notifications 中, 如果我要使用 es locale 來傳送 notification, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    $user->notify((new InvoicePaid($invoice))->這裏是?('es'));
  • Answer:

    <?php
    $user->notify((new InvoicePaid($invoice))->locale('es'));
Laravel Notifications 中, 如果我要使用 es locale 來傳送 notification 給複數的 notifiable entities, 在以下的 example 中可以怎麼做?
  • Example:

    <?php
    Notification::這裏是?('es')->send($users, new InvoicePaid($invoice));
  • Answer:

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


# User Preferred Locales

Laravel Notifications 中, 如果我們針對每個 User 有儲存各自的 locale, 在以下的 example 中, 我該使用哪個 method 來定義取得各自的 locale?
  • Example:

    <?php
    use Illuminate\Contracts\Translation\HasLocalePreference;

    class User extends Model implements HasLocalePreference
    {
    /**
    * Get the user's preferred locale.
    *
    * @return string
    */
    public function 這裏是?()
    {
    return $this->locale;
    }
    }
  • Answer:

    <?php
    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;
    }
    }
Laravel Notifications 中, 如果我們針對每個 User 有儲存各自的 locale, 在以下的 example 中, 我該 implement 哪一個 interface?
  • Example:

    <?php
    use Illuminate\Contracts\Translation\HasLocalePreference;

    class User extends Model implements 這裏是?
    {
    /**
    * Get the user's preferred locale.
    *
    * @return string
    */
    public function preferredLocale()
    {
    return $this->locale;
    }
    }
  • Answer:

    <?php
    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;
    }
    }




# Notification Events

Laravel Notifications 中, 每當 notification 被傳送了, 都會觸發一個什麼事件?

Illuminate\Notifications\Events\NotificationSent

Laravel Notifications 中, 如果我想要註冊一個事件, 每當 notification 被傳送就會觸發這個事件, 那麼我可以在哪個檔案中註冊這個事件的 listener?

EventServiceProvider

以下的 Laravel example code 的意思是?
  • Example:

    <?php
    class EventServiceProvider extends ServiceProvider
    {
    protected $listen = [
    'Illuminate\Notifications\Events\NotificationSent' => [
    'App\Listeners\LogNotification',
    ],
    ];
    }
  • Answer:
    在 EventServiceProvider 的 $listen property 中, 定義了每當 notification 傳送, 就觸發 LogNotification listener

Laravel Notifications 中, 當我我想要註冊一個事件 Listener, 每當 notification 被傳送就會觸發這個事件的 Listener, 在以下的 example 中, 我該如何取得該 notification 的 channel?
  • Example:

    <?php
    public function handle(NotificationSent $event)
    {
    // 這裏是?
    }
  • Answer:

    <?php
    public function handle(NotificationSent $event)
    {
    // $event->channel
    }
Laravel Notifications 中, 當我我想要註冊一個事件 Listener, 每當 notification 被傳送就會觸發這個事件的 Listener, 在以下的 example 中, 我該如何取得該 notification 的 notifiable instance?
  • Example:

    <?php
    public function handle(NotificationSent $event)
    {
    // 這裏是?
    }
  • Answer:

    <?php
    public function handle(NotificationSent $event)
    {
    // $event->notifiable
    }
Laravel Notifications 中, 當我我想要註冊一個事件 Listener, 每當 notification 被傳送就會觸發這個事件的 Listener, 在以下的 example 中, 我該如何取得該 notification 的 notification instance?
  • Example:

    <?php
    public function handle(NotificationSent $event)
    {
    // 這裏是?
    }
  • Answer:

    <?php
    public function handle(NotificationSent $event)
    {
    // $event->notification
    }
Laravel Notifications 中, 當我我想要註冊一個事件 Listener, 每當 notification 被傳送就會觸發這個事件的 Listener, 在以下的 example 中, 我該如何取得該 notification 的 response instance?
  • Example:

    <?php
    public function handle(NotificationSent $event)
    {
    // 這裏是?
    }
  • Answer:

    <?php
    public function handle(NotificationSent $event)
    {
    // $event->response
    }




# Custom Channels

Laravel Notifications 中, 如果我想要自定義我自己的 channel, 可以參考哪裡?

官方文件

Operating System Concept PHP - Data Structure and Algorithm

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×