<article><h1>Laravel 的消息通知系統</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#creating-notifications">創建通知</a></li><li><a href="#sending-notifications">發送通知</a><ul><li><a href="#using-the-notifiable-trait">使用 Notifiable Trait</a></li><li><a href="#using-the-notification-facade">使用 Notification Facade</a></li><li><a href="#specifying-delivery-channels">指定發送頻道</a></li><li><a href="#queueing-notifications">隊列化通知</a></li></ul></li><li><a href="#mail-notifications">郵件通知</a><ul><li><a href="#formatting-mail-messages">格式化郵件消息</a></li><li><a href="#customizing-the-recipient">自定義接受者</a></li><li><a href="#customizing-the-subject">自定義主題</a></li><li><a href="#customizing-the-templates">自定義模板</a></li></ul></li><li><a href="#markdown-mail-notifications">Markdown 郵件通知</a><ul><li><a href="#generating-the-message">生成消息</a></li><li><a href="#writing-the-message">寫消息</a></li><li><a href="#customizing-the-components">自定義組件</a></li></ul></li><li><a href="#database-notifications">數據庫通知</a><ul><li><a href="#database-prerequisites">先決條件</a></li><li><a href="#formatting-database-notifications">格式化數據庫通知</a></li><li><a href="#accessing-the-notifications">訪問通知</a></li><li><a href="#marking-notifications-as-read">標為已讀</a></li></ul></li><li><a href="#broadcast-notifications">廣播通知</a><ul><li><a href="#broadcast-prerequisites">先決條件</a></li><li><a href="#formatting-broadcast-notifications">格式化廣播通知</a></li><li><a href="#listening-for-notifications">監聽通知</a></li></ul></li><li><a href="#sms-notifications">短信通知</a><ul><li><a href="#sms-prerequisites">先決條件</a></li><li><a href="#formatting-sms-notifications">格式化短信通知</a></li><li><a href="#customizing-the-from-number">自定義 <code class=" language-php">From</code> 號碼</a></li><li><a href="#routing-sms-notifications">路由短信通知</a></li></ul></li><li><a href="#slack-notifications">Slack 通知</a><ul><li><a href="#slack-prerequisites">先決條件</a></li><li><a href="#formatting-slack-notifications">格式化 Slack 通知</a></li><li><a href="#slack-attachments">Slack Attachments</a></li><li><a href="#routing-slack-notifications">路由 Slack 通知</a></li></ul></li><li><a href="#notification-events">通知事件</a></li><li><a href="#custom-channels">自定義發送頻道</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p>除了 <a href="/docs/5.4/mail">發送郵件</a>,Laravel 還支持通過多種頻道發送通知,包括郵件、短信(通過 <a href="https://www.nexmo.com/">Nexmo</a>)以及 <a href="https://slack.com">Slack</a> 。通知還能存到數據庫,這樣就能在網頁界面上顯示了。</p><p>通常情況下,通知應該是簡短、有信息量的消息來通知用戶你的應用發生了什么。舉例來說,如果你在編寫一個在線交易應用,你應該會通過郵件和短信頻道來給用戶發送一條 「賬單已付」 的通知。</p><p><a name="creating-notifications"></a></p><h2><a href="#creating-notifications">創建通知</a></h2><p>Laravel 中一條通知就是一個類(通常存在 <code class=" language-php">app<span class="token operator">/</span>Notifications</code> 文件夾里)。看不到的話不要擔心,運行一下 <code class=" language-php">make<span class="token punctuation">:</span>notification</code> 命令就能創建了:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>notification InvoicePaid</code></pre><p>這個命令會在 <code class=" language-php">app<span class="token operator">/</span>Notifications</code> 目錄下生成一個新的通知類。這個類包含 <code class=" language-php">via</code> 方法和幾個消息構建方法(比如 <code class=" language-php">toMail</code> 或 <code class=" language-php">toDatabase</code>),它們會針對指定的渠道把通知轉換過為對應的消息。</p><p><a name="sending-notifications"></a></p><h2><a href="#sending-notifications">發送通知</a></h2><p><a name="using-the-notifiable-trait"></a></p><h3>使用 Notifiable Trait</h3><p>通知可以通過兩種方法發送: <code class=" language-php">Notifiable</code> trait 的 <code class=" language-php">notify</code> 方法或 <code class=" language-php">Notification</code> <a href="/docs/5.4/facades">facade</a> 。首先,讓我們探索使用 trait :</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notifiable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>User</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>默認的 <code class=" language-php">App\<span class="token package">User</span></code> 模型中使用了這個 trait,它包含著一個可以用來發通知的方法:<code class=" language-php">notify</code> 。 <code class=" language-php">notify</code> 方法需要一個通知實例做參數:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>InvoicePaid</span><span class="token punctuation">;</span>
<span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">InvoicePaid</span><span class="token punctuation">(</span><span class="token variable">$invoice</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 記住,你可以在任意模型中使用 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Notifiable</span></code> trait,而不僅僅是在 <code class=" language-php">User</code> 模型中。</p></blockquote><p><a name="using-the-notification-facade"></a></p><h3>使用 Notification Facade</h3><p>另外,你可以通過 <code class=" language-php">Notification</code> <a href="/docs/5.4/facades">facade</a> 來發送通知。它主要用在當你給多個可接收通知的實體發送通知的時候,比如給用戶集合發通知。要用 facade 發送通知的話,要把可接收通知的實體和通知的實例傳遞給 <code class=" language-php">send</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Notification<span class="token punctuation">::</span></span><span class="token function">send<span class="token punctuation">(</span></span><span class="token variable">$users</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">InvoicePaid</span><span class="token punctuation">(</span><span class="token variable">$invoice</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="specifying-delivery-channels"></a></p><h3>指定發送頻道</h3><p>每個通知類都有個 <code class=" language-php">via</code> 方法,它決定了通知在哪個頻道上發送。開箱即用的通知頻道有 <code class=" language-php">mail</code>, <code class=" language-php">database</code>, <code class=" language-php">broadcast</code>, <code class=" language-php">nexmo</code>, 和 <code class=" language-php">slack</code> 。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果你想用其他的頻道比如 Telegram 或者 Pusher ,可以去看下社區驅動的 <a href="http://laravel-notification-channels.com">Laravel 通知頻道網站</a> 。</p></blockquote><p><code class=" language-php">via</code> 方法受到一個 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實例,它是接收通知的類實例。你可以用 <code class=" language-php"><span class="token variable">$notifiable</span></code> 來決定通知用哪個頻道來發送:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知發送頻道
*
* @param mixed $notifiable
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">via<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$notifiable</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">prefers_sms</span> <span class="token operator">?</span> <span class="token punctuation">[</span><span class="token string">'nexmo'</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'mail'</span><span class="token punctuation">,</span> <span class="token string">'database'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="queueing-notifications"></a></p><h3>隊列化通知</h3><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 在隊列化通知前你需要配置隊列,并 <a href="/docs/5.4/queues">運行隊列處理器</a>。</p></blockquote><p>發送通知可能會花很長時間,尤其是發送頻道需要調用外部 API 的時候。要加速應用響應的話,可以通過添加 <code class=" language-php">ShouldQueue</code> 接口和 <code class=" language-php">Queueable</code> trait 把通知加入隊列。它們兩個在使用 <code class=" language-php">make<span class="token punctuation">:</span>notification</code> 命令來生成通知文件的時候就已經被導入了,所以你只需要添加到你的通知類就行了:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Notifications</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Bus<span class="token punctuation">\</span>Queueable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notification</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Contracts<span class="token punctuation">\</span>Queue<span class="token punctuation">\</span>ShouldQueue</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">InvoicePaid</span> <span class="token keyword">extends</span> <span class="token class-name">Notification</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldQueue</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true"> // ...
</span><span class="token punctuation">}</span></code></pre><p>一旦加入 <code class=" language-php">ShouldQueue</code> 接口,你就能像平常那樣發送通知了。Laravel 會檢測 <code class=" language-php">ShouldQueue</code> 接口并自動將通知的發送放入隊列中。</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">InvoicePaid</span><span class="token punctuation">(</span><span class="token variable">$invoice</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果你想延遲發送,你可以通過 <code class=" language-php">delay</code> 方法來鏈式操作你的通知實例:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$when</span> <span class="token operator">=</span> <span class="token scope">Carbon<span class="token punctuation">::</span></span><span class="token function">now<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addMinutes<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify<span class="token punctuation">(</span></span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">InvoicePaid</span><span class="token punctuation">(</span><span class="token variable">$invoice</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">delay<span class="token punctuation">(</span></span><span class="token variable">$when</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="mail-notifications"></a></p><h2><a href="#mail-notifications">郵件通知</a></h2><p><a name="formatting-mail-messages"></a></p><h3>格式化郵件消息</h3><p>如果一條通知支持以郵件發送,你應該在通知類里定義一個 <code class=" language-php">toMail</code> 方法。這個方法將收到一個 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實體并返回一個 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Messages<span class="token punctuation">\</span>MailMessage</span></code> 實例。郵件消息可以包含多行文本也可以是引導鏈接。我們來看一個 <code class=" language-php">toMail</code> 方法的例子:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">url<span class="token punctuation">(</span></span><span class="token string">'/invoice/'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MailMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">line<span class="token punctuation">(</span></span><span class="token string">'One of your invoices has been paid!'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">action<span class="token punctuation">(</span></span><span class="token string">'View Invoice'</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">line<span class="token punctuation">(</span></span><span class="token string">'Thank you for using our application!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 注意我們在方法中用了 <code class=" language-php"><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span></code> ,其實你可以傳遞應用所需要的任何數據來傳遞給通知的構造器。</p></blockquote><p>在這個例子中,我們注冊了一行文本,引導鏈接 ,然后又是一行文本。 <code class=" language-php">MailMessage</code> 提供的這些方法簡化了對小的事務性的郵件進行格式化操作。郵件頻道將會把這些消息組件轉換成漂亮的響應式的 HTML 郵件模板并附上文本。下面是個 <code class=" language-php">mail</code> 頻道生成的郵件示例:</p><img src="https://laravel.com/assets/img/notification-example.png" width="551" height="596"><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 發送郵件通知前,請在 <code class=" language-php">config<span class="token operator">/</span>app<span class="token punctuation">.</span>php</code> 中設置 <code class=" language-php">name</code> 值。 這將會在郵件通知消息的頭部和尾部中被使用。</p></blockquote><h4>其他通知格式選項</h4><p>你可以使用 <code class=" language-php">view</code> 方法來指定一個應用于渲染通知電子郵件的自定義模板,而不是在通知類中定義文本的「模板」:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MailMessage</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span>
<span class="token string">'emails.name'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'invoice'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token punctuation">]</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>另外,你可以從 <code class=" language-php">toMail</code> 方法中返回一個 <a href="/docs/5.4/mail">mailable 對象</a> :</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Mail<span class="token punctuation">\</span>InvoicePaid</span> <span class="token keyword">as</span> Mailable<span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return Mailable
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Mailable</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">email</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="error-messages"></a></p><h4>錯誤消息</h4><p>有些通知是給用戶提示錯誤,比如賬單支付失敗的提示。你可以通過調用 <code class=" language-php">error</code> 方法來指定這條郵件消息被當做一個錯誤提示。當郵件消息使用了 <code class=" language-php">error</code> 方法后,引導鏈接按鈕會變成紅色而非藍色:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MailMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">error<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">subject<span class="token punctuation">(</span></span><span class="token string">'Notification Subject'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">line<span class="token punctuation">(</span></span><span class="token string">'...'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-recipient"></a></p><h3>自定義接收者</h3><p>當通過 <code class=" language-php">mail</code> 頻道來發送通知的時候,通知系統將會自動尋找你的 notifiable 實體中的 <code class=" language-php">email</code> 屬性。你可以通過在實體中定義 <code class=" language-php">routeNotificationForMail</code> 方法來自定義郵件地址。</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notifiable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>User</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 郵件頻道的路由
*
* @return string
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">routeNotificationForMail<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">email_address</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-subject"></a></p><h3>自定義主題</h3><p>默認情況下,郵件主題是格式化成了標題格式的通知類的類名。所以如果你對通知類名為 <code class=" language-php">InvoicePaid</code> ,郵件主題將會是 <code class=" language-php">Invoice Paid</code> 。如果你想顯式指定消息的主題,你可以在構建消息時調用 <code class=" language-php">subject</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MailMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">subject<span class="token punctuation">(</span></span><span class="token string">'Notification Subject'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">line<span class="token punctuation">(</span></span><span class="token string">'...'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-templates"></a></p><h3>自定義模板</h3><p>你可以通過發布通知包的資源來修改 HTML 模板和純文本模板。運行這個命令后,郵件通知模板就被放在了 <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>vendor<span class="token operator">/</span>notifications</code> 文件夾下:</p><pre class=" language-php"><code class=" language-php">php artisan vendor<span class="token punctuation">:</span>publish <span class="token operator">--</span>tag<span class="token operator">=</span>laravel<span class="token operator">-</span>notifications</code></pre><p><a name="markdown-mail-notifications"></a></p><h2><a href="#markdown-mail-notifications">Markdown 郵件通知</a></h2><p>Markdown 郵件通知可讓您利用郵件通知的預先構建的模板,同時給予您更多自由地撰寫更長的自定義郵件。 由于消息是用 Markdown 編寫的, Laravel 能夠為消息呈現漂亮,響應的 HTML 模板,同時還自動生成純文本對應。</p><p><a name="generating-the-message"></a></p><h3>生成消息</h3><p>要使用相應的 Markdown 模板生成通知,您可以使用 <code class=" language-php">make:notification</code> Artisan命令的 <code class=" language-php"><span class="token operator">--</span>markdown</code> 選項:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>notification InvoicePaid <span class="token operator">--</span>markdown<span class="token operator">=</span>mail<span class="token punctuation">.</span>invoice<span class="token punctuation">.</span>paid</code></pre><p>與所有其他郵件通知一樣,使用 Markdown 模板的通知應在其通知類上定義一個 <code class=" language-php">toMail</code> 方法。 但是,不使用 <code class=" language-php">line</code> 和 <code class=" language-php">action</code> 方法來構造通知,而是使用 <code class=" language-php">markdown</code> 方法來指定應該使用的 Markdown 模板的名稱:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的郵件展示方式
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toMail<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">url<span class="token punctuation">(</span></span><span class="token string">'/invoice/'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MailMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">subject<span class="token punctuation">(</span></span><span class="token string">'Invoice Paid'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">markdown<span class="token punctuation">(</span></span><span class="token string">'mail.invoice.paid'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'url'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$url</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="writing-the-message"></a></p><h3>寫消息</h3><p>Markdown 郵件通知使用 Blade 組件和Markdown語法的組合,允許您輕松構建通知,同時利用Laravel的預制通知組件:</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::message'</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">
# Invoice Paid
</span>
Your invoice has been paid<span class="token operator">!</span>
@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::button'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'url'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$url</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
View Invoice
@endcomponent
Thanks<span class="token punctuation">,</span><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>br</span><span class="token punctuation">></span></span></span>
<span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token function">config<span class="token punctuation">(</span></span><span class="token string">'app.name'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>
@endcomponent</code></pre><h4>按鈕組件</h4><p>按鈕組件渲染了一個居中的鏈接按鈕。組件有兩個參數, <code class=" language-php">url</code> 和一個可選的參數 <code class=" language-php">color</code> 。支持的顏色有 <code class=" language-php">blue</code> , <code class=" language-php">green</code> , 和 <code class=" language-php">red</code> 。你可以根據你的需要向通知中添加任意數量的按鈕組件:</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::button'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'url'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token string">'color'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'green'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
View Invoice
@endcomponent</code></pre><h4>面板組件</h4><p>面板部件在面板中呈現給定文本塊,該面板具有與通知的其余部分稍微不同的背景顏色。 這將會允許你將給定的文本塊引起注意:</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::panel'</span><span class="token punctuation">)</span>
This is the panel content<span class="token punctuation">.</span>
@endcomponent</code></pre><h4>表格組件</h4><p>表格組件允許你將一個 Markdown 表格轉化成一個 HTML 表格。表格組件接受 Markdown 表格作為內容。支持使用默認的 Markdown 表格對齊語法使表列對齊:</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::table'</span><span class="token punctuation">)</span>
<span class="token operator">|</span> Laravel <span class="token operator">|</span> Table <span class="token operator">|</span> Example <span class="token operator">|</span>
<span class="token operator">|</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span> <span class="token operator">|</span><span class="token punctuation">:</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token punctuation">:</span><span class="token operator">|</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token punctuation">:</span><span class="token operator">|</span>
<span class="token operator">|</span> Col <span class="token number">2</span> is <span class="token operator">|</span> Centered <span class="token operator">|</span> <span class="token variable">$10</span> <span class="token operator">|</span>
<span class="token operator">|</span> Col <span class="token number">3</span> is <span class="token operator">|</span> Right<span class="token operator">-</span>Aligned <span class="token operator">|</span> <span class="token variable">$20</span> <span class="token operator">|</span>
@endcomponent</code></pre><p><a name="customizing-the-components"></a></p><h3>自定義組件</h3><p>您可以將所有 Markdown 通知組件導出到您自己的應用程序中進行自定義。 要導出組件,請使用 <code class=" language-php">vendor:publish</code> Artisan命令來發布 <code class=" language-php">laravel<span class="token operator">-</span>mail</code> 標簽:</p><pre class=" language-php"><code class=" language-php">php artisan vendor<span class="token punctuation">:</span>publish <span class="token operator">--</span>tag<span class="token operator">=</span>laravel<span class="token operator">-</span>mail</code></pre><p>此命令將 Markdown 郵件組件發布到 <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>vendor<span class="token operator">/</span>mail</code> 目錄。 <code class=" language-php">mail</code> 目錄將包含一個 <code class=" language-php">html</code> 和一個 <code class=" language-php">markdown</code> 目錄,每個目錄包含它們各自可用組件的展示方式。 您可以隨意自定義這些組件。</p><h4>自定義CSS</h4><p>導出組件后, <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>vendor<span class="token operator">/</span>mail<span class="token operator">/</span>html<span class="token operator">/</span>themes</code> 目錄將包含一個 <code class=" language-php"><span class="token keyword">default</span><span class="token punctuation">.</span>css</code> 文件。 您可以在此文件中自定義 CSS ,并且您的樣式將自動內嵌在 Markdown 通知的HTML展示中。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果您想為 Markdown 組件構建一個全新的主題,只需在 <code class=" language-php">html<span class="token operator">/</span>themes</code> 目錄中寫一個新的 CSS 文件,并更改 <code class=" language-php">mail</code> 配置文件中的 <code class=" language-php">theme</code> 選項。</p></blockquote><p><a name="database-notifications"></a></p><h2><a href="#database-notifications">數據庫通知</a></h2><p><a name="database-prerequisites"></a></p><h3>先決條件</h3><p><code class=" language-php">database</code> 通知頻道在一張數據表里存儲通知信息。這張表包含了比如通知類型、JSON 格式數據等描述通知的信息。</p><p>你可以查詢這張表的內容在應用界面上展示通知。但是在這之前,你需要先創建一個數據表來保存通知。你可以用 <code class=" language-php">notifications<span class="token punctuation">:</span>table</code> 命令來生成遷移表:</p><pre class=" language-php"><code class=" language-php">php artisan notifications<span class="token punctuation">:</span>table
php artisan migrate</code></pre><p><a name="formatting-database-notifications"></a></p><h3>格式化數據庫通知</h3><p>如果通知支持被存儲到數據表中,你應該在通知類中定義一個 <code class=" language-php">toDatabase</code> 或 <code class=" language-php">toArray</code> 方法。這個方法接收 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實體參數并返回一個普通的 PHP 數組。這個返回的數組將被轉成 JSON 格式并存儲到通知數據表的 <code class=" language-php">data</code> 列。我們來看一個 <code class=" language-php">toArray</code> 的例子:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的數組展示方式
*
* @param mixed $notifiable
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toArray<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span>
<span class="token string">'invoice_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">,</span>
<span class="token string">'amount'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">amount</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4><code class=" language-php">toDatabase</code> Vs <code class=" language-php">toArray</code></h4><p><code class=" language-php">toArray</code> 方法在 <code class=" language-php">broadcast</code> 頻道也用到了,它用來決定廣播給 JavaScript 客戶端的數據。如果你想在 <code class=" language-php">database</code> 和 <code class=" language-php">broadcast</code> 頻道中采用兩種不同的數組展示方式,你應該定義 <code class=" language-php">toDatabase</code> 方法而非 <code class=" language-php">toArray</code> 方法。</p><p><a name="accessing-the-notifications"></a></p><h3>訪問通知</h3><p>一旦通知被存到數據庫中,你需要一種方便的方式來從通知實體中訪問它們。 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Notifiable</span></code> trait 包含一個可以返回這個實體所有通知的 <code class=" language-php">notifications</code> Eloquent 關聯。要獲取這些通知,你可以像用其他 Eloquent 關聯一樣來使用這個方法。默認情況下,通知將會以 <code class=" language-php">created_at</code> 時間戳來排序:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token scope">App<span class="token punctuation">\</span>User<span class="token punctuation">::</span></span><span class="token function">find<span class="token punctuation">(</span></span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">notifications</span> <span class="token keyword">as</span> <span class="token variable">$notification</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">type</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>如果你只想檢索未讀通知,你可以使用 <code class=" language-php">unreadNotifications</code> 關聯。檢索出來的通知也是以 <code class=" language-php">created_at</code> 時間戳來排序的:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token scope">App<span class="token punctuation">\</span>User<span class="token punctuation">::</span></span><span class="token function">find<span class="token punctuation">(</span></span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">unreadNotifications</span> <span class="token keyword">as</span> <span class="token variable">$notification</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">type</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 要從 JavaScript 客戶端來訪問通知的話,你應該定義一個通知控制器來給可通知的實體返回通知,比如給當前用戶返回通知。然后你就可以在 JavaScript 客戶端來發起對應 URI 的 HTTP 請求了。</p></blockquote><p><a name="marking-notifications-as-read"></a></p><h3>標為已讀</h3><p>通常情況下,當用戶查看了通知時,你就希望把通知標為已讀。<code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Notifiable</span></code> trait 提供了一個 <code class=" language-php">markAsRead</code> 方法,它能在對應的數據庫記錄里更新 <code class=" language-php">read_at</code> 列:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token scope">App<span class="token punctuation">\</span>User<span class="token punctuation">::</span></span><span class="token function">find<span class="token punctuation">(</span></span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">unreadNotifications</span> <span class="token keyword">as</span> <span class="token variable">$notification</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">markAsRead<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>你可以使用 <code class=" language-php">markAsRead</code> 方法直接操作一個通知集合,而不是一條條遍歷每個通知:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">unreadNotifications</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">markAsRead<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>你可以用批量更新的方式來把所有通知標為已讀,而不用在數據庫里檢索:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token scope">App<span class="token punctuation">\</span>User<span class="token punctuation">::</span></span><span class="token function">find<span class="token punctuation">(</span></span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">unreadNotifications<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">update<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'read_at'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token scope">Carbon<span class="token punctuation">::</span></span><span class="token function">now<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>當然,你可以通過 <code class=" language-php">delete</code> 通知來把它們從數據庫刪除:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notifications<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">delete<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="broadcast-notifications"></a></p><h2><a href="#broadcast-notifications">廣播通知</a></h2><p><a name="broadcast-prerequisites"></a></p><h3>先決條件</h3><p>在廣播通知前,你應該配置并熟悉 Laravel <a href="/docs/5.4/broadcasting">事件廣播</a> 服務。事件廣播提供了一種 JavaScript 客戶端響應服務端 Laravel 事件的機制。</p><p><a name="formatting-broadcast-notifications"></a></p><h3>格式化廣播通知</h3><p><code class=" language-php">broadcast</code> 頻道使用 Laravel <a href="/docs/5.4/broadcasting">事件廣播</a> 服務來廣播通知,它使得 JavaScript 客戶端可以實時捕捉通知。如果一條通知支持廣播,你應該在通知類里定義一個 <code class=" language-php">toBroadcast</code> 或 <code class=" language-php">toArray</code> 方法。這個方法將收到一個 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實體并返回一個普通的 PHP 數組。返回的數組會被編碼成 JSON 格式并廣播給你的 JavaScript 客戶端。我們來看個 <code class=" language-php">toArray</code> 方法的例子:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Messages<span class="token punctuation">\</span>BroadcastMessage</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 獲取通知的數組展示方式
*
* @param mixed $notifiable
* @return BroadcastMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toBroadcast<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">BroadcastMessage</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
<span class="token string">'invoice_id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">,</span>
<span class="token string">'amount'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">amount</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>廣播隊列配置</h4><p>所有廣播通知都排隊等待廣播。 如果要配置用于廣播隊列操作的隊列連接或隊列名稱,你可以使用 <code class=" language-php">BroadcastMessage</code> 的 <code class=" language-php">onConnection</code> 和 <code class=" language-php">onQueue</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">BroadcastMessage</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">onConnection<span class="token punctuation">(</span></span><span class="token string">'sqs'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">onQueue<span class="token punctuation">(</span></span><span class="token string">'broadcasts'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 除了你指定的數據外,廣播通知也包含一個 <code class=" language-php">type</code> 字段,這個字段包含了通知類的類名。</p></blockquote><p><a name="listening-for-notifications"></a></p><h3>監聽通知</h3><p>通知將會在一個私有頻道里進行廣播,頻道格式為 <code class=" language-php"><span class="token punctuation">{</span>notifiable<span class="token punctuation">}</span><span class="token punctuation">.</span><span class="token punctuation">{</span>id<span class="token punctuation">}</span></code>。所以,如果你給 ID 為 <code class=" language-php"><span class="token number">1</span></code> 的 <code class=" language-php">App\<span class="token package">User</span></code> 實例發送通知,這個通知就在 <code class=" language-php">App<span class="token punctuation">.</span>User<span class="token number">.1</span></code> 私有頻道里被發送。當你使用 <a href="/docs/5.4/broadcasting">Laravel Echo</a> 的時候,你可以很簡單地使用 <code class=" language-php">notification</code> 輔助函數來監聽一個頻道的通知:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">Echo</span><span class="token punctuation">.</span><span class="token keyword">private</span><span class="token punctuation">(</span><span class="token string">'App.User.'</span> <span class="token operator">+</span> userId<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">notification<span class="token punctuation">(</span></span><span class="token punctuation">(</span>notification<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log<span class="token punctuation">(</span></span>notification<span class="token punctuation">.</span>type<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>自定義通知通道</h4><p>如果您想自定義應通知實體接收其廣播通知的渠道,您可以定義一個 <code class=" language-php">receiveBroadcastNotificationsOn</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notifiable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Broadcasting<span class="token punctuation">\</span>PrivateChannel</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>User</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 用戶接收的通知廣播
*
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">receivesBroadcastNotificationsOn<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span>
<span class="token keyword">new</span> <span class="token class-name">PrivateChannel</span><span class="token punctuation">(</span><span class="token string">'users.'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="sms-notifications"></a></p><h2><a href="#sms-notifications">短信通知</a></h2><p><a name="sms-prerequisites"></a></p><h3>先決條件</h3><p>在 Laravel 中發送短信通知是基于 <a href="https://www.nexmo.com/">Nexmo</a> 服務的。在通過 Nexmo 發送短信通知前,你需要安裝 <code class=" language-php">nexmo<span class="token operator">/</span>client</code> Composer 包并在 <code class=" language-php">config<span class="token operator">/</span>services<span class="token punctuation">.</span>php</code> 配置文件中添加幾個配置選項。你可以復制下面的配置示例來開始使用:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'nexmo'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'key'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env<span class="token punctuation">(</span></span><span class="token string">'NEXMO_KEY'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token string">'secret'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">env<span class="token punctuation">(</span></span><span class="token string">'NEXMO_SECRET'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token string">'sms_from'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'15556666666'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><code class=" language-php">sms_from</code> 選項是短信消息發送者的手機號碼。你可以在 Nexmo 控制面板中生成一個手機號碼。</p><p><a name="formatting-sms-notifications"></a></p><h3>格式化短信通知</h3><p>如果通知支持以短信方式發送,你應該在通知類里定義一個 <code class=" language-php">toNexmo</code> 方法。這個方法將會收到一個 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實體并返回一個 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Messages<span class="token punctuation">\</span>NexmoMessage</span></code> 實例:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Nexmo / 短信展示方式
*
* @param mixed $notifiable
* @return NexmoMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toNexmo<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">NexmoMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'Your SMS message content'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>Unicode 內容</h4><p>如果您的 SMS 消息包含 unicode 字符,您應該在構建 <code class=" language-php">NexmoMessage</code> 實例時調用 <code class=" language-php">unicode</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Nexmo / 短信展示方式
*
* @param mixed $notifiable
* @return NexmoMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toNexmo<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">NexmoMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'Your unicode message'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">unicode<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-from-number"></a></p><h3>自定義 <code class=" language-php">From</code> 號碼</h3><p>如果你想通過一個手機號來發送某些通知,而這個手機號不同于你的 <code class=" language-php">config<span class="token operator">/</span>services<span class="token punctuation">.</span>php</code> 配置文件中指定的話,你可以在 <code class=" language-php">NexmoMessage</code> 實例中使用 <code class=" language-php">from</code>:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Nexmo / 短信展示方式
*
* @param mixed $notifiable
* @return NexmoMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toNexmo<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">NexmoMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'Your SMS message content'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">from<span class="token punctuation">(</span></span><span class="token string">'15554443333'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="routing-sms-notifications"></a></p><h3>路由短信通知</h3><p>當通過 <code class=" language-php">nexmo</code> 頻道來發送通知的時候,通知系統會自動尋找通知實體的 <code class=" language-php">phone_number</code> 屬性。如果你想自定義通知被發送的手機號碼,你要在通知實體里定義一個 <code class=" language-php">routeNotificationForNexmo</code> 方法。</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notifiable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>User</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* Nexmo 頻道的路由通知
*
* @return string
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">routeNotificationForNexmo<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">phone</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="slack-notifications"></a></p><h2><a href="#slack-notifications">Slack 通知</a></h2><p><a name="slack-prerequisites"></a></p><h3>先決條件</h3><p>通過 Slack 發送通知前,你必須通過 Composer 安裝 Guzzle HTTP 庫:</p><pre class=" language-php"><code class=" language-php">composer <span class="token keyword">require</span> guzzlehttp<span class="token operator">/</span>guzzle</code></pre><p>你還需要給 Slack 組配置 「Incoming Webhook」 。它將提供你使用 <a href="#routing-slack-notifications">路由 Slack 通知</a> 時用到的 URL。</p><p><a name="formatting-slack-notifications"></a></p><h3>格式化 Slack 通知</h3><p>如果通知支持被當做 Slack 消息發送,你應該在通知類里定義一個 <code class=" language-php">toSlack</code> 方法。這個方法將收到一個 <code class=" language-php"><span class="token variable">$notifiable</span></code> 實體并且返回一個 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Messages<span class="token punctuation">\</span>SlackMessage</span></code> 實例。Slack 消息可以包含文本內容以及一個 「attachment」 用來格式化額外文本或者字段數組。我們來看個基本的 <code class=" language-php">toSlack</code> 例子:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'One of your invoices has been paid!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>這個例子中,我們只發送了一行文本給 Slack,這會創建類似下面的一條消息:</p><img src="https://laravel.com/assets/img/basic-slack-notification.png"><h4>自定義發件人和收件人</h4><p>您可以使用 <code class=" language-php">from</code> 和 <code class=" language-php">to</code> 方法來自定義發件人和收件人。 <code class=" language-php">from</code> 方法接受用戶名和表情符號標識符,而 <code class=" language-php">to</code> 方法接受一個頻道或用戶名:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">from<span class="token punctuation">(</span></span><span class="token string">'Ghost'</span><span class="token punctuation">,</span> <span class="token string">':ghost:'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token comment" spellcheck="true">'#other')
</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span>'This will be sent to<span class="token comment" spellcheck="true"> #other');
</span><span class="token punctuation">}</span></code></pre><p>你也可以不使用表情符號,改為使用圖片作為你的 logo:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">from<span class="token punctuation">(</span></span><span class="token string">'Laravel'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">image<span class="token punctuation">(</span></span><span class="token string">'https://laravel.com/favicon.png'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'This will display the Laravel logo next to the message'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="slack-attachments"></a></p><h3>Slack 附加項 (Attachments)</h3><p>你可以給 Slack 消息添加 "附加項"。附加項提供了比簡單文本消息更豐富的格式化選項。在這個例子中,我們將發送一條有關應用中異常的錯誤通知,它里面有個可以查看這個異常更多詳情的鏈接:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式。
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">url<span class="token punctuation">(</span></span><span class="token string">'/exceptions/'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">error<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'Whoops! Something went wrong.'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attachment<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$attachment</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$attachment</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">title<span class="token punctuation">(</span></span><span class="token string">'Exception: File Not Found'</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'File [background.jpg] was not found.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>上面這個例子將會生成一條類似下面的 Slack 消息:</p><img src="https://laravel.com/assets/img/basic-slack-attachment.png"><p>附加項也允許你指定一個應該被展示給用戶的數據的數組。給定的數據將會以表格樣式展示出來,這能方便閱讀:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">url<span class="token punctuation">(</span></span><span class="token string">'/invoices/'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">invoice</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">success<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'One of your invoices has been paid!'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attachment<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$attachment</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$attachment</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">title<span class="token punctuation">(</span></span><span class="token string">'Invoice 1322'</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">fields<span class="token punctuation">(</span></span><span class="token punctuation">[</span>
<span class="token string">'Title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Server Expenses'</span><span class="token punctuation">,</span>
<span class="token string">'Amount'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'$1,234'</span><span class="token punctuation">,</span>
<span class="token string">'Via'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'American Express'</span><span class="token punctuation">,</span>
<span class="token string">'Was Overdue'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">':-1:'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>上面的例子將會生成一條類似下面的 Slack 消息:</p><img src="https://laravel.com/assets/img/slack-fields-attachment.png"><h4>Markdown 附件內容</h4><p>如果一些附件字段包含 Markdown ,您可以使用 <code class=" language-php">markdown</code> 方法指示 Slack 解析并將給定的附件字段顯示為 Markdown 格式的文本:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取通知的 Slack 展示方式
*
* @param mixed $notifiable
* @return SlackMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toSlack<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">url<span class="token punctuation">(</span></span><span class="token string">'/exceptions/'</span><span class="token punctuation">.</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlackMessage</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">error<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'Whoops! Something went wrong.'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attachment<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$attachment</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$attachment</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">title<span class="token punctuation">(</span></span><span class="token string">'Exception: File Not Found'</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">content<span class="token punctuation">(</span></span><span class="token string">'File [background.jpg] was **not found**.'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">markdown<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'title'</span><span class="token punctuation">,</span> <span class="token string">'text'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="routing-slack-notifications"></a></p><h3>路由 Slack 通知</h3><p>要把 Slack 通知路由到正確的位置,你要在通知實體中定義 <code class=" language-php">routeNotificationForSlack</code> 方法。它返回通知要被發往的 URL 回調地址。URL 可以通過在 Slack 組里面添加 "Incoming Webhook" 服務來生成。</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notifiable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Auth<span class="token punctuation">\</span>User</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* Slack 頻道的通知路由
*
* @return string
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">routeNotificationForSlack<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">slack_webhook_url</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="notification-events"></a></p><h2><a href="#notification-events">通知事件</a></h2><p>當通知發送后,通知系統就會觸發 <code class=" language-php">Illuminate\<span class="token package">Notifications<span class="token punctuation">\</span>Events<span class="token punctuation">\</span>NotificationSent</span></code> 事件。它包含了 「notifiable」 實體和通知實例本身。你應該在 <code class=" language-php">EventServiceProvider</code> 中注冊監聽器:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 應用中的事件監聽映射
*
* @var array
*/</span>
<span class="token keyword">protected</span> <span class="token variable">$listen</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'Illuminate\Notifications\Events\NotificationSent'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogNotification'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 注冊完監聽器后,使用 <code class=" language-php">event<span class="token punctuation">:</span>generate</code> Artisan 命令來快速生成監聽器類。</p></blockquote><p>在事件監聽器中,你可以訪問事件中的 <code class=" language-php">notifiable</code>, <code class=" language-php">notification</code>, 和 <code class=" language-php">channel</code> 屬性,來了解通知接收者和通知本身:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 處理事件
*
* @param NotificationSent $event
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">handle<span class="token punctuation">(</span></span>NotificationSent <span class="token variable">$event</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // $event->channel
</span> <span class="token comment" spellcheck="true"> // $event->notifiable
</span> <span class="token comment" spellcheck="true"> // $event->notification
</span><span class="token punctuation">}</span></code></pre><p><a name="custom-channels"></a></p><h2><a href="#custom-channels">自定義頻道</a></h2><p>Laravel 提供了開箱即用的通知頻道,但是你可能會想編寫自己的驅動來通過其他頻道發送通知。Laravel 很容易實現。首先,定義一個包含 <code class=" language-php">send</code> 方法的類。這個方法應該收到兩個參數:<code class=" language-php"><span class="token variable">$notifiable</span></code> 和 <code class=" language-php"><span class="token variable">$notification</span></code>:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Channels</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notification</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">VoiceChannel</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* 發送給定通知
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">send<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">,</span> Notification <span class="token variable">$notification</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$message</span> <span class="token operator">=</span> <span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">toVoice<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true"> // 將通知發送給 $notifiable 實例
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>一旦定義了通知頻道類,你應該在所有通知里通過 <code class=" language-php">via</code> 方法來簡單地返回這個頻道的類名。</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Notifications</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Bus<span class="token punctuation">\</span>Queueable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Channels<span class="token punctuation">\</span>VoiceChannel</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Channels<span class="token punctuation">\</span>Messages<span class="token punctuation">\</span>VoiceMessage</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Notifications<span class="token punctuation">\</span>Notification</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Contracts<span class="token punctuation">\</span>Queue<span class="token punctuation">\</span>ShouldQueue</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">InvoicePaid</span> <span class="token keyword">extends</span> <span class="token class-name">Notification</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 獲取通知頻道
*
* @param mixed $notifiable
* @return array|string
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">via<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token scope">VoiceChannel<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* 獲取通知的聲音展示方式
*
* @param mixed $notifiable
* @return VoiceMessage
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toVoice<span class="token punctuation">(</span></span><span class="token variable">$notifiable</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // ...
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="https://phphub.org/users/11602">@司維</a></td><td><img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/11602_1487572457.png?imageView2/1/w/380/h/380"></td><td>翻譯</td><td> <a href="https://github.com/leon0204">@Leon0204</a> at Github</td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度