لاراول علاوه بر پشتیبانی از امکان ارسال ایمیل، از امکان ارسال نوتیفیکیشنها (اعلانها) بر روی کانالهای مختلفی مانند mail ،SMS (از طریق Nexmo) و Slack پشتیبانی میکند. نوتیفیکیشنها را میتوان در یک پایگاه داده ذخیره کرد تا بتوان در رابط وب آنها را نمایش داد.
معمولا، نوتیفیکیشنها باید پیامهای کوتاه و شامل اطلاعاتی باشند که کاربران را از اتفاقی که در برنامه شما رخ داده است، مطلع کنند. برای مثال، اگر شما در حال نوشتن یک برنامه پرداخت صورت حساب هستید، میتوانید از طریق کانالهای ایمیل و SMS، نوتیفیکیشن «صورتحساب پرداخت شده است» را به کاربران خود ارسال کنید.
ایجاد نوتیفیکیشنها در لاراول
در لاراول، هر نوتیفیکیشن با یک کلاس واحد (که معمولا در دایرکتوری app/Notifications
ذخیره میشود) نمایش داده میشود. اگر این دایرکتوری در برنامه شما وجود ندارد، نگران نباشید زیرا در زمان اجرای دستور آرتیسان make:notification
این دایرکتوری برای شما ایجاد میشود:
1 | php artisan make<span class="token punctuation">:</span>notification InvoicePaid |
این دستور یک کلاس notification جدید را در دایرکتوری app/Notifications
شما قرار میدهد. هر کلاس notification شامل یک متد via
و تعدادی از متدهای ایجاد پیام مانند toMail
یا toDatabase
است که نوتیفیکیشن را به یک پیام بهینه سازی شده برای ارسال به یک کانال خاص تبدیل میکند.
ارسال نوتیفیکیشن ها در لاراول
با استفاده از ویژگی Notifiable
نوتیفیکیشنها را میتوان به دو روش ارسال کرد، با استفاده از متد notify
از ویژگی Notifiable
یا با استفاده ازfacadeNotification
. ابتدا، اجازه دهید از ویژگی Notifiable
استفاده کنیم:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token php language-php"><span class="token delimiter important"><?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></span> |
این ویژگی توسط مدل پیشفرض App\User
استفاده میشود و شامل یک متد notify
است که برای ارسال نوتیفیکیشنها به کار میرود. متد notify
یک نمونه نوتیفیکیشن را دریافت میکند:
1 2 3 | <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><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> |
توجه کنید که شما میتوانید از ویژگی
Illuminate\Notifications\Notifiable
بر روی هر یک از مدلهای خود در لاراول استفاده کنید و فقط محدود به استفاده از آن در مدلUser
برنامه خود نیستید.
با استفاده از Notification Facade
شما همچنین میتوانید از طریق Facade Notification
نوتیفیکیشنها را ارسال کنید. این روش زمانی مفید است که برای مثال شما نیاز به ارسال یک نوتیفیکیشن به چند موجودیت قابل اعلان (notifiable entities) مانند مجموعهای از کاربران داشته باشید. برای ارسال نوتیفیکیشنها با استفاده از Facade، تمام موجودیتهای قابل اعلان و نمونه نوتیفیکیشن را به متد send
ارسال کنید:
1 | <span class="token scope">Notification<span class="token punctuation">::</span></span><span class="token function">send</span><span class="token punctuation">(</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> |
مشخص کردن کانال های تحویل نوتیفیکیشن
هر کلاس notification دارای یک متد via
است که مشخص میکند که نوتیفیکیشن به کدام کانالها تحویل داده خواهد شد. معمولا، نوتیفیکیشنها میتوانند بر روی کانالهای mail
، database
، broadcas
t، nexmo
و slack
ارسال شوند.
اگر بخواهید از کانالهای تحویل دیگری مانند Telegram یا Pusher استفاده کنید، میتوانید برای کسب اطلاعات بیشتر، سری به وب سایت کانالهای نوتیفیکیشن لاراول بزنید.
متد via
یک نمونه $notifiable
دریافت میکند که نمونهای از کلاس نوتیفیکیشنی است که ارسال میشود. شما میتوانید با استفاده از $notifiable
تعیین کنید که نوتیفیکیشن بر روی کدام کانال باید تحویل داده شود:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">/** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">via</span><span class="token punctuation">(</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> |
نوتیفیکیشنهای صف شده در لاراول
قبل از صف بندی نوتیفیکیشنها در یک صف، شما ابتدا باید صف خود را پیکربندی کرده و یک worker را استارت کنید.
ارسال نوتیفیکیشنها ممکن است کاری زمانبر باشد، به خصوص اگر کانال برای دریافت نوتیفیکیشن نیاز به یک فراخوانی خارجی داشته باشد. برای سرعت بخشیدن به زمان پاسخ برنامه، میتوانید با اضافه کردن رابط ShouldQueue
و یک ویژگی Queueable
به کلاس، نوتیفیکیشن خود را صف بندی کنید. این رابط و ویژگی از قبل برای تمام نوتیفیکیشنها ایمپورت شده و با استفاده از دستور make:notification
ساخته شده است. بنابراین، شما میتوانید بلافاصله آنها را به کلاس notification خود اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token php language-php"><span class="token delimiter important"><?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">// ...</span> <span class="token punctuation">}</span></span> |
زمانی که رابط ShouldQueue
به نوتیفیکیشن شما اضافه شد، میتوانید این نوتیفیکیشن را به صورت عادی ارسال کنید. لاراول این رابط را در درون کلاس شناسایی کرده و به صورت خودکار تحویل نوتیفیکیشن را صف بندی میکند:
1 | <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify</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> |
اگر میخواهید تحویل نوتیفیکیشن را به تاخیر بیاندازید، میتوانید متد delay
را به نوتیفیکیشن خود انتقال دهید:
1 2 3 | <span class="token variable">$when</span> <span class="token operator">=</span> <span class="token function">now</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">addMinutes</span><span class="token punctuation">(</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><span class="token punctuation">(</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><span class="token punctuation">(</span><span class="token variable">$when</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
نوتیفیکیشنهای On-Demand در لاراول
گاهی اوقات، شما ممکن است نیاز به ارسال یک نوتیفیکیشن به کسی دارید که به عنوان یک کاربر (user) در برنامه شما ذخیره نشده است. با استفاده از متد Notification::route
، قبل از ارسال نوتیفیکیشن، میتوانید اطلاعات مسیریابی نوتیفیکیشن ad-hoc را مشخص کنید:
1 2 3 | <span class="token scope">Notification<span class="token punctuation">::</span></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'mail'</span><span class="token punctuation">,</span> <span class="token string">'taylor@example.com'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string">'nexmo'</span><span class="token punctuation">,</span> <span class="token string">'5555555555'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">notify</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> |
نوتیفیکیشن های Mail در لاراول
فرمت کردن پیام های ایمیل
اگر بخواهید یک نوتیفیکیشن را به عنوان یک ایمیل ارسال کنید، باید یک متد toMail
را در کلاس نوتیفیکیشن تعریف کنید. این متد یک $notifiable
را دریافت میکند و باید یک نمونه از Illuminate\Notifications\Messages\MailMessage
را بازگرداند. پیامهای ایمیل ممکن است حاوی خطوط متنی و همچنین فراخوانی یک اکشن باشند. اجازه دهید، نگاهی به یک مثال از متد toMail
داشته باشیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">/** * Get the mail representation of the notification. * * @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><span class="token punctuation">(</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><span class="token punctuation">(</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">greeting</span><span class="token punctuation">(</span><span class="token string">'Hello!'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">line</span><span class="token punctuation">(</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><span class="token punctuation">(</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><span class="token punctuation">(</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> |
توجه کنید که ما از
this->invoice->id$
در متدtoMail
استفاده میکنیم. شما میتوانید هر دادهای را که نوتیفیکیشن برای ایجاد پیام خود نیاز دارد را به سازنده نوتیفیکیشن انتقال دهید.
ما در این مثال، یک پیام خوشامد، یک خط متن، یک فراخوانی اکشن و سپس یک خط متنی دیگر را ثبت میکنیم. این متدها توسط شی MailMessage
ارائه میشوند که عملیات قالب بندی ایمیلهای معاملاتی کوچک را ساده و سریع میکنند. سپس، کانال ایمیل، اجزای پیام را به یک قالب ایمیل HTML پاسخگو با یک تطابق متن ساده (plain-text) ترجمه میکند. در اینجا، مثالی از ایجاد ایمیل توسط کانال mail
را مشاهده میکنید:
در زمان ارسال نوتیفیکیشنهای ایمیل، مطمئن شوید که مقدار
name
در فایل پیکربندیconfig/app.php
شما تنظیم شده باشد. این مقدار در قسمت هدر و پاورقی پیامهای نوتیفیکیشن ایمیل شما استفاده میشود.
سایر گزینه های قالب بندی نوتیفیکیشن
به جای تعریف خطوط متنی در کلاس notification، میتوانید از متد view
برای مشخص کردن یک قالب سفارشی استفاده کنید که باید برای ارسال نوتیفیکیشن ایمیل مورد استفاده قرار گیرد:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment">/** * Get the mail representation of the notification. * * @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><span class="token punctuation">(</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><s |