# 前言
學習一個框架, 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 example code 的意思是?
- Example:
<?php
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice)); - Answer:
使用 notifiable trait 的 notify() 將該 notification 發送給該 user, 具體使用哪一種 notification type 視乎在InvoicePaid
中的 via method 如何定義
# Using The Notification Facade
Laravel Notifications 中, 什麼情境下比較適合使用 Notification Facade?
當我要發送 notification 給多個對象時
以下的 Laravel example code 的意思是?
- Example:
<?php
Notification::send($users, new InvoicePaid($invoice)); - Answer:
使用 Notification facade 一次發送 notification 給多個 user
# 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 example code 的意思是?
- Example:
<?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;
// ...
} - Answer:
implement ShouldQueue interface, 該 notification 將會被 queue
use Queueable trait, 該 notification 內可使用 Queueable trait 定義的 method
以下的 Laravel example code 的意思是?
- Example:
<?php
$when = now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($when)); - Answer:
不立即發送 notification, 會 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 example code 的意思是?
- Example:
<?php
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!');
} - Answer:
在 notification 的 toMail() 中定義 mail 的格式以及內容
# 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 example code 的意思是?
- Example:
<?php
public function toMail($notifiable)
{
return (new MailMessage)
->error()
->subject('Notification Subject')
->line('...');
} - Answer:
使用 error() 當該 mail 內容是與 error 有關
# Customizing The Sender
Laravel Notifications 中, 預設的 mail sender 定義在哪個檔案中
config/mail.php
以下的 Laravel example code 的意思是?
- Example:
<?php
public function toMail($notifiable)
{
return (new MailMessage)
->from('test@example.com', 'Example')
->line('...');
} - Answer:
定義 mail sender, 除了可在config/mail.php
定義之外, 也可使用 from() 定義
# Customizing The Recipient
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
public function routeNotificationForMail($notification)
{
// Return email address only...
return $this->email_address;
}
} - Answer:
當寄送 mail 時, 預設會去尋找 notifiable 的 email property, 如果我不想使用 email, 可以使用 routeNotificationForMail(), 自定義成 email_address
# Customizing The Subject
Laravel Notifications 中, 當我使用 mail 發送 notification 時, 預設 subject 是什麼?
class name, 如果 class 是 InvoicePaid, subject 就是 Invoice Paid
以下的 Laravel example code 的意思是?
- Example:
<?php
public function toMail($notifiable)
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
} - Answer:
當使用 mail notification 時, 預設 subject 會是 class name, 比如 InvoicePaid 會變成 Invoice Paid, 可使用 subject() 自定義
# Customizing The Mailer
以下的 Laravel example code 的意思是?
- Example:
<?php
public function toMail($notifiable)
{
return (new MailMessage)
->mailer('postmark')
->line('...');
} - Answer:
若要定義 mailer driver, 除了可在config/mail.php
定義之外, 也可使用 mailer() 定義
# Customizing The Templates
以下的 Laravel example code 的意思是?
- Example:
php artisan vendor:publish --tag=laravel-notifications
- Answer:
會將 vendor 中的 notification 模板匯出, 可完全自定義
# 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 example command 的意思是?
- Example:
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
- Answer:
建立一個名為InvoicePaid
的 notification, 以及一個 markdown, 路徑為 mail/invoice/paid
以下的 Laravel example command 的意思是?
- Example:
<?php
public function toMail($notifiable)
{
$url = url('/invoice/'.$this->invoice->id);
return (new MailMessage)
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
} - Answer:
使用 markdown template 來定義 mail 的格式內容
# Writing The Message
# Button Component
以下的 Laravel example command 的意思是?
- Example:
<?php
@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent - Answer:
當使用 markdown template 定義 mail 格式內容時, 使用 @component, 建立一個內建的 mail button, 並指定其 url 以及 color
# Panel Component
以下的 Laravel example command 的意思是?
- Example:
<?php
@component('mail::panel')
This is the panel content.
@endcomponent - Answer:
當使用 markdown template 定義 mail 格式內容時, 使用 mail::panel, 該區塊內的背景顏色會不同, 以凸顯區塊內的文字
# Table Component
以下的 Laravel example command 的意思是?
- Example:
<?php
@component('mail::table')
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
@endcomponent - Answer:
當使用 markdown template 定義 mail 時, 使用 mail::table 定義一個 markdown 格式的 table
# Customizing The Components
以下的 Laravel example command 的意思是?
- Example:
php artisan vendor:publish --tag=laravel-mail
- Answer:
會將 vendor 中 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 |
# 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 example command 的意思是?
- Example:
<?php
public function toArray($notifiable)
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
} - Answer:
在 notification 內, 當使用 database notification 時, 使用 toArray() 定義內容
toArray() 可用於 broadcast 以及 database, 當兩者都有用到時, 請使用 toDatabase 以及 toBroadcast
# Accessing The Notifications
Laravel Notifications 中, 如果我要從 notifiable model 來存取 notification data, 我可以使用哪一個 trait?
Illuminate\Notifications\Notifiable
trait
Laravel Notifications 中, notification 預設會以什麼排序?
created_at
以下的 Laravel example code 的意思是?
- Example:
<?php
$user = App\User::find(1);
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
} - Answer:
當使用 Database notification 時, 可以使用 unreadNotifications relation 取得所有未讀的 notification
# Marking Notifications As Read
以下的 Laravel example command 的意思是?
- Example:
<?php
$user = App\User::find(1);
foreach ($user->unreadNotifications as $notification) {
$notification->markAsRead();
} - Answer:
當使用 database notification 時, 可使用markAsRead()
標記特定 notification as read
Laravel Notifications 中, 當我使用 markAsRead() method 時, 可以使用在 collection 上嗎?
可
以下的 Laravel testing example code 的意思是?
- Example:
<?php
$user->notifications()->delete(); - Answer:
刪除該 user 的 database notification
# 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 example code 的意思是?
- Example:
<?php
public function toBroadcast($notifiable)
{
return new BroadcastMessage([
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
]);
} - Answer:
在 toBroadcast method 內, 使用 new BroadcastMessage instance 來定義 broadcast message
# Broadcast Queue Configuration
以下的 Laravel example command 的意思是?
- Example:
<?php
return (new BroadcastMessage($data))
->onConnection('sqs')
->onQueue('broadcasts'); - Answer:
在 broadcast notification 中指定 queue 以及 connection
# Customizing The Notification Type
以下的 Laravel example command 的意思是?
- Example:
<?php
use Illuminate\Notifications\Messages\BroadcastMessage;
public function broadcastType()
{
return 'broadcast.message';
} - Answer:
預設 broadcast notification type 為 notification 的 full class name, 若要自定義, 可使用 broadcastType()
# Listening For Notifications
以下的 Laravel example code 的意思是?
- Example:
<?php
Echo.private('App.User.' + userId)
.notification((notification) => {
console.log(notification.type);
}); - Answer:
Laravel echo 可以 listen 事先定義好的 channel, 並接收 broadcast 後採取後續動作
listen private channel ‘App.User.userId’, userId 為動態的, 之後再 console.log notification object 的 type property
# Customizing The Notification Channel
以下的 Laravel example code 的意思是?
- 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 receivesBroadcastNotificationsOn()
{
return 'users.'.$this->id;
}
} - Answer:
當 notifiable 為 user 時, 在 user model 中定義 Broadcast notification 的對象 channel
# SMS Notifications
# Prerequisites
Laravel Notifications 中, 當我要使用 Nexmo 來發送 SMS notification 時, 要先安裝什麼?
Nexmo 套件
composer require laravel/nexmo-notification-channel |
Laravel Notifications 中, 當我使用 Nexmo 來發送 SMS notification 時, 需在哪個檔案中定義發送端的號碼?
config/services.php
以下位於 config/services.php 的 Laravel example code 的意思是?
- Example:
<?php
'nexmo' => [
'sms_from' => '15556666666',
], - Answer:
定義 Nexmo sender 的號碼
# Formatting SMS Notifications
Laravel Notifications 中, 如果使用 SMS notification 的話, notification class 中該使用哪一個 method 來定義內容?
toNexmo method
以下位於 Notification 的 Laravel example code 的意思是?
- Example:
<?php
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your SMS message content');
} - Answer:
定義 Nexmo message 的內容, 然後可以在 via method 內使用 Nexmo
# 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 example code 的意思是?
- Example:
<?php
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your unicode message')
->unicode();
} - Answer:
使用 Nexmo notification 時, 如果 content 含有 unicode, 需加上 unicode()
# Customizing The “From” Number
Laravel Notifications 中, 當使用 Nexmo notification 時, 預設的傳送人號碼被定義在哪?
config/services.php
以下的 Laravel example code 的意思是?
- Example:
<?php
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your SMS message content')
->from('15554443333');
} - Answer:
除了在 config/service.php 可定義發送人的號碼外, 也可使用 from() 指定
# Routing SMS Notifications
以下的 Laravel example code 的意思是?
- Example:
<?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;
}
} - Answer:
當使用 Nexmo notification 時, 可在 User model 的 routeNotificationForNexmo method 定義 user phone number 實際上的 column name
# 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
以下位於 notification 的 Laravel example code 的意思是?
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.');
});
}Answer:
使用 attachment() 定義更豐富的格式選項, 如下 picturePicture:
以下位於 notification 的 Laravel example code 的意思是?
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)
->fields([
'Title' => 'Server Expenses',
'Amount' => '$1,234',
'Via' => 'American Express',
'Was Overdue' => ':-1:',
]);
});
}Answer:
使用 fields(), 定義 table 的效果Picture:
# Markdown Attachment Content
以下位於 notification 的 Laravel example code 的意思是?
- 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*.')
->markdown(['text']);
});
} - Answer:
使用 markdown() 定義 markdown 語法
Laravel Slack Notifications 中, 有關 markdown format 的詳細資訊, 可以參考?
# Routing Slack Notifications
Laravel Slack Notifications 中, notifiable entity 中的 routeNotificationForSlack
應該要 return 什麼?
webhook URL
Laravel Slack Notifications 中, 該在 notifiable entity 當中使用哪個 method 來定義接收方?
routeNotificationForSlack method
# Localizing Notifications
以下的 Laravel example code 的意思是?
- Example:
<?php
$user->notify((new InvoicePaid($invoice))->locale('es')); - Answer:
使用 notifiable trait send notification 並使用 locale() 定義 notification locale
以下的 Laravel example code 的意思是?
- Example:
<?php
Notification::locale('es')->send($users, new InvoicePaid($invoice)); - Answer:
使用 notification facade send notification 給多個 users 並使用 locale() 定義 notification locale
# User Preferred Locales
以下的 Laravel example code 的意思是?
- Example:
<?php
use Illuminate\Contracts\Translation\HasLocalePreference;
class User extends Model implements HasLocalePreference
{
public function preferredLocale()
{
return $this->locale;
}
} - Answer:
implement HasLocalePreference, 並使用 preferredLocale() 定義每個 user 的 locale, example 中假定在每個 user row 中都有定義 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
以下位於 custom listener 的 Laravel example code 的意思是?
- Example:
<?php
public function handle(NotificationSent $event)
{
$event->channel
$event->notifiable
$event->notification
$event->response
} - Answer:
<?php
// 註冊一個 Listener, 監聽 NotificationSent event, 每當 notification sent, 就觸發此 Listener
public function handle(NotificationSent $event)
{
// 取得該 notification 的 channel
$event->channel
// 取得該 notification 的 notifiable instance
$event->notifiable
// 取得該 notification 的 notification instance
$event->notification
// 取得該 notification 的 response instance
$event->response
}
留言