نسخه:

اطلاعیه

معرفی

لاراول علاوه بر پشتیبانی از ارسال ایمیل ، از ارسال اعلان‌ها در انواع کانال‌های تحویل، از جمله ایمیل، پیامک (از طریق Vonage ، که قبلاً Nexmo نامیده می‌شد) و Slack پشتیبانی می‌کند . اعلان ها همچنین ممکن است در یک پایگاه داده ذخیره شوند تا در رابط وب شما نمایش داده شوند.

به طور معمول، اعلان‌ها باید پیام‌های کوتاه و اطلاعاتی باشند که کاربران را از اتفاقی که در برنامه شما رخ داده است مطلع می‌کند. به عنوان مثال، اگر در حال نوشتن یک برنامه صورتحساب هستید، ممکن است از طریق کانال های ایمیل و پیامک، اعلان «فاکتور پرداخت شده» را برای کاربران خود ارسال کنید.

ایجاد اعلان ها

در لاراول، هر اعلان توسط یک کلاس نمایش داده می شود (معمولاً در app/Notifications دایرکتوری ذخیره می شود). اگر این دایرکتوری را در برنامه خود نمی بینید نگران نباشید، با اجرای make:notification دستور Artisan برای شما ایجاد می شود:

php artisan make:notification InvoicePaid

این دستور یک کلاس نوتیفیکیشن تازه را در app/Notifications دایرکتوری شما قرار می دهد. هر کلاس اعلان شامل یک via متد و تعداد متغیری از متدهای ساخت پیام (مانند toMail یا toDatabase ) است که اعلان را به پیامی بهینه شده برای آن کانال خاص تبدیل می کند.

ارسال اعلان ها

استفاده از ویژگی Notifiable Trait

اعلان ها ممکن است به دو صورت ارسال شوند: با استفاده از notify روش صفت Notifiable یا استفاده از Notification نما . ابتدا بیایید با استفاده از این ویژگی را بررسی کنیم:

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

این ویژگی توسط App\User مدل پیش‌فرض استفاده می‌شود و حاوی یک روش است که ممکن است برای ارسال اعلان‌ها استفاده شود: notify . این notify روش انتظار دارد یک نمونه اعلان دریافت کند:

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

به یاد داشته باشید، می توانید از این Illuminate\Notifications\Notifiable ویژگی در هر یک از مدل های خود استفاده کنید. شما محدود به گنجاندن آن در مدل خود نیستید User .

با استفاده از نمای اعلان

همچنین، می‌توانید اعلان‌ها را از طریق Notification نما ارسال کنید . این در درجه اول زمانی مفید است که شما نیاز به ارسال اعلان به چندین نهاد قابل اطلاع رسانی مانند مجموعه ای از کاربران دارید. برای ارسال اعلان‌ها با استفاده از نما، تمام نهادهای قابل اطلاع و نمونه اعلان را به send روش ارسال کنید:

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

تعیین کانال های تحویل

هر کلاس اطلاع رسانی via روشی دارد که تعیین می کند اعلان در کدام کانال ارسال می شود. اعلان‌ها ممکن است در کانال‌ها،،،، mail و ارسال شوند . database broadcast nexmo slack

اگر می‌خواهید از کانال‌های تحویل دیگر مانند تلگرام یا Pusher استفاده کنید، وب‌سایت کانال‌های اطلاع رسانی لاراول را بررسی کنید .

متد via یک $notifiable نمونه دریافت می کند که نمونه ای از کلاسی است که اعلان به آن ارسال می شود. $notifiable برای تعیین اینکه اعلان باید در کدام کانال ها ارسال شود، می توانید استفاده کنید :

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

نوتیفیکیشن های صف

قبل از صف‌بندی اعلان‌ها، باید صف خود را پیکربندی کنید و یک Worker راه‌اندازی کنید .

ارسال اعلان ها ممکن است زمان بر باشد، به خصوص اگر کانال برای ارسال اعلان به یک تماس API خارجی نیاز داشته باشد. برای سرعت بخشیدن به زمان پاسخگویی برنامه خود، اجازه دهید اعلان شما با افزودن ShouldQueue رابط و Queueable ویژگی به کلاس خود در صف قرار گیرد. رابط و ویژگی قبلاً برای همه اعلان‌های ایجاد شده با استفاده از وارد شده است make:notification ، بنابراین می‌توانید فوراً آنها را به کلاس اعلان خود اضافه کنید:

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

هنگامی که ShouldQueue رابط به اعلان شما اضافه شد، می توانید اعلان را مانند معمول ارسال کنید. لاراول ShouldQueue اینترفیس کلاس را شناسایی می کند و به طور خودکار تحویل اعلان را در صف قرار می دهد:

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

اگر می‌خواهید تحویل اعلان را به تأخیر بیندازید، می‌توانید روش را delay به نمونه اعلان خود زنجیره بزنید:

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

سفارشی کردن صف کانال اطلاع رسانی

اگر می خواهید صف خاصی را مشخص کنید که باید برای هر کانال اعلان پشتیبانی شده توسط اعلان استفاده شود، می توانید روشی را viaQueues در اعلان خود تعریف کنید. این روش باید آرایه ای از جفت نام کانال / نام صف را برگرداند:

/**
* Determine which queues should be used for each notification channel.
*
* @return array
*/
public function viaQueues()
{
return [
'mail' => 'mail-queue',
'slack' => 'slack-queue',
];
}

اعلان های درخواستی

گاهی اوقات ممکن است لازم باشد برای شخصی که به عنوان "کاربر" برنامه شما ذخیره نشده است، اعلان ارسال کنید. با استفاده از Notification::route روش نما، می توانید قبل از ارسال اعلان، اطلاعات مسیریابی اعلان موقت را مشخص کنید:

Notification::route('mail', 'taylor@example.com')
->route('nexmo', '5555555555')
->route('slack', 'https://hooks.slack.com/services/...')
->notify(new InvoicePaid($invoice));

اعلان های پستی

قالب بندی پیام های ایمیل

اگر یک اعلان از ارسال به صورت ایمیل پشتیبانی می کند، باید toMail روشی را در کلاس اعلان تعریف کنید. این روش یک $notifiable موجودیت دریافت می کند و باید یک Illuminate\Notifications\Messages\MailMessage نمونه را برگرداند. پیام‌های ایمیل ممکن است حاوی خطوط متنی و همچنین یک «تماس برای اقدام» باشند. بیایید نگاهی به یک toMail روش مثال بیندازیم:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$url = url('/invoice/'.$this->invoice->id);
 
return (new MailMessage)
->greeting('Hello!')
->line('One of your invoices has been paid!')
->action('View Invoice', $url)
->line('Thank you for using our application!');
}

$this->invoice->id توجه داشته باشید که ما در روش خود استفاده می کنیم toMail . می‌توانید هر داده‌ای را که اعلان شما برای تولید پیام آن نیاز دارد به سازنده اعلان ارسال کنید.

در این مثال، ما یک تبریک، یک خط متن، یک فراخوان برای اقدام و سپس خط دیگری از متن ثبت می کنیم. این روش‌های ارائه شده توسط MailMessage شی، قالب‌بندی ایمیل‌های تراکنشی کوچک را ساده و سریع می‌کند. سپس کانال ایمیل اجزای پیام را به یک الگوی ایمیل HTML زیبا و پاسخگو با همتای متن ساده ترجمه می کند. در اینجا نمونه ای از ایمیل ایجاد شده توسط mail کانال آمده است:

هنگام ارسال اعلان نامه، حتما مقدار را در فایل پیکربندی name خود تنظیم کنید. config/app.php این مقدار در سرصفحه و پاورقی پیام‌های اعلان ایمیل شما استفاده می‌شود.

سایر گزینه های قالب بندی اطلاعیه

به جای تعریف "خطوط" متن در کلاس اعلان، می توانید از view روش برای تعیین یک الگوی سفارشی استفاده کنید که باید برای ارائه ایمیل اعلان استفاده شود:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)->view(
'emails.name', ['invoice' => $this->invoice]
);
}

view می‌توانید با ارسال نام view به عنوان دومین عنصر آرایه‌ای که به متد داده می‌شود، یک نمای متن ساده برای پیام ایمیل تعیین کنید MailMessage :

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)->view(
['emails.name.html', 'emails.name.plain'],
['invoice' => $this->invoice]
);
}

علاوه بر این، می توانید یک شیء کامل پستی را از toMail متد برگردانید:

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

پیغام خطا

برخی از اعلان ها کاربران را از خطاهایی مانند پرداخت ناموفق فاکتور مطلع می کند. error ممکن است با فراخوانی روش هنگام ساخت پیام خود، نشان دهید که یک پیام ایمیل در مورد خطا است . هنگام استفاده از error روش در یک پیام ایمیل، دکمه تماس برای اقدام به جای آبی قرمز خواهد بود:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Message
*/
public function toMail($notifiable)
{
return (new MailMessage)
->error()
->subject('Notification Subject')
->line('...');
}

سفارشی کردن فرستنده

به طور پیش فرض، آدرس فرستنده / from ایمیل در config/mail.php فایل پیکربندی تعریف شده است. با این حال، می توانید آدرس from را برای یک اعلان خاص با استفاده از from روش زیر مشخص کنید:

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

سفارشی کردن گیرنده

هنگام ارسال اعلان ها از طریق mail کانال، سیستم اعلان به طور خودکار به دنبال یک email دارایی در نهاد قابل اطلاع شما می گردد. routeNotificationForMail می‌توانید با تعریف روشی در نهاد ، آدرس ایمیلی که برای ارسال اعلان استفاده می‌شود را سفارشی کنید :

<?php
 
namespace App;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable
{
use Notifiable;
 
/**
* Route notifications for the mail channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return array|string
*/
public function routeNotificationForMail($notification)
{
// Return email address only...
return $this->email_address;
 
// Return name and email address...
return [$this->email_address => $this->name];
}
}

سفارشی کردن موضوع

به‌طور پیش‌فرض، موضوع ایمیل، نام کلاس اعلان است که به «مورد عنوان» قالب‌بندی شده است. بنابراین، اگر کلاس اعلان شما نام دارد InvoicePaid ، موضوع ایمیل خواهد بود Invoice Paid . اگر می‌خواهید یک موضوع واضح برای پیام مشخص کنید، می‌توانید subject در هنگام ساخت پیام خود، این روش را فراخوانی کنید:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}

سفارشی کردن میلر

به طور پیش فرض، اعلان ایمیل با استفاده از درایور پیش فرض تعریف شده در config/mail.php فایل پیکربندی ارسال می شود. با این حال، می‌توانید در زمان اجرا با فراخوانی mailer متد هنگام ساخت پیام خود، یک میلر متفاوت را مشخص کنید:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->mailer('postmark')
->line('...');
}

سفارشی سازی قالب ها

می توانید با انتشار منابع بسته اعلان، الگوی HTML و متن ساده مورد استفاده در اعلان های پستی را تغییر دهید. پس از اجرای این دستور، الگوهای اعلان نامه در resources/views/vendor/notifications دایرکتوری قرار خواهند گرفت:

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

پیش نمایش اعلان های ایمیل

هنگام طراحی یک الگوی اعلان نامه، آسان است که به سرعت پیام ایمیل ارائه شده را در مرورگر خود مانند یک الگوی معمولی Blade پیش نمایش کنید. به همین دلیل، لاراول به شما این امکان را می دهد که هر پیام ایمیلی را که توسط یک اعلان ایمیل ایجاد شده است، مستقیماً از یک مسیر بسته یا کنترلر برگردانید. هنگامی که a MailMessage برگردانده می شود، نمایش داده می شود و در مرورگر نمایش داده می شود و به شما این امکان را می دهد که به سرعت طرح آن را بدون نیاز به ارسال آن به آدرس ایمیل واقعی، پیش نمایش کنید:

Route::get('mail', function () {
$invoice = App\Invoice::find(1);
 
return (new App\Notifications\InvoicePaid($invoice))
->toMail($invoice->user);
});

اعلان‌های ایمیل Markdown

اعلان‌های ایمیل Markdown به شما این امکان را می‌دهند که از الگوهای از پیش ساخته شده اعلان‌های ایمیل استفاده کنید، در حالی که به شما آزادی بیشتری برای نوشتن پیام‌های سفارشی و طولانی‌تر می‌دهد. از آنجایی که پیام‌ها در Markdown نوشته می‌شوند، لاراول می‌تواند قالب‌های زیبا و پاسخ‌گوی HTML را برای پیام‌ها ارائه کند و در عین حال به‌طور خودکار یک متن ساده نیز تولید کند.

تولید پیام

برای ایجاد یک اعلان با یک الگوی Markdown مربوطه، می توانید --markdown از گزینه make:notification دستور Artisan استفاده کنید:

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

مانند سایر اعلان‌های ایمیل، اعلان‌هایی که از الگوهای Markdown استفاده می‌کنند باید toMail روشی را در کلاس اعلان خود تعریف کنند. با این حال، به جای استفاده از متدهای line و action برای ساخت اعلان، از markdown روشی برای تعیین نام الگوی Markdown که باید استفاده شود استفاده کنید:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$url = url('/invoice/'.$this->invoice->id);
 
return (new MailMessage)
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}

نوشتن پیام

اعلان‌های ایمیل Markdown از ترکیبی از اجزای Blade و نحو Markdown استفاده می‌کنند که به شما امکان می‌دهد به راحتی اعلان‌ها را بسازید در حالی که از اجزای اعلان از پیش ساخته شده لاراول استفاده می‌کنید:

@component('mail::message')
# Invoice Paid
 
Your invoice has been paid!
 
@component('mail::button', ['url' => $url])
View Invoice
@endcomponent
 
Thanks,<br>
{{ config('app.name') }}
@endcomponent

جزء دکمه

جزء دکمه یک پیوند دکمه مرکزی را ارائه می دهد. مؤلفه دو آرگومان a url و اختیاری را می پذیرد color . رنگ های پشتیبانی شده عبارتند از blue , green , و red . می‌توانید به تعداد دلخواه اجزای دکمه را به یک اعلان اضافه کنید:

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

جزء پنل

مؤلفه پانل بلوک متن داده شده را در پانلی ارائه می کند که رنگ پس زمینه کمی متفاوت از بقیه اعلان دارد. این به شما امکان می دهد توجه را به یک بلوک متن معین جلب کنید:

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

جزء جدول

جزء جدول به شما امکان می دهد یک جدول Markdown را به یک جدول HTML تبدیل کنید. کامپوننت جدول Markdown را به عنوان محتوای خود می پذیرد. تراز ستون جدول با استفاده از نحو پیش فرض تراز جدول Markdown پشتیبانی می شود:

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

سفارشی سازی کامپوننت ها

شما می توانید تمام اجزای اعلان Markdown را برای سفارشی سازی به برنامه خود صادر کنید. برای صادرات کامپوننت ها، از vendor:publish دستور Artisan برای انتشار laravel-mail تگ دارایی استفاده کنید:

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

این دستور اجزای ایمیل Markdown را در resources/views/vendor/mail دایرکتوری منتشر می کند. دایرکتوری mail شامل یک دایرکتوری html و یک text دایرکتوری خواهد بود که هر کدام شامل نمایش های مربوط به هر جزء موجود می باشد. شما آزاد هستید که این اجزا را هر طور که دوست دارید سفارشی کنید.

سفارشی کردن CSS

پس از صادرات اجزاء، resources/views/vendor/mail/html/themes دایرکتوری حاوی یک default.css فایل خواهد بود. می‌توانید CSS را در این فایل سفارشی کنید و سبک‌های شما به‌طور خودکار در نمایش‌های HTML اعلان‌های Markdown شما قرار می‌گیرد.

اگر می‌خواهید یک موضوع کاملاً جدید برای اجزای Markdown لاراول بسازید، می‌توانید یک فایل CSS را در html/themes دایرکتوری قرار دهید. پس از نامگذاری و ذخیره فایل CSS، theme گزینه mail فایل پیکربندی را به روز کنید تا با نام تم جدید شما مطابقت داشته باشد.

برای سفارشی کردن طرح زمینه برای یک اعلان فردی، می‌توانید theme هنگام ساخت پیام ایمیل اعلان، روش را فراخوانی کنید. این theme روش نام موضوعی را می‌پذیرد که باید هنگام ارسال اعلان استفاده شود:

/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->theme('invoice')
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}

اطلاعیه های پایگاه داده

پیش نیازها

کانال database اطلاع رسانی اطلاعات اعلان را در یک جدول پایگاه داده ذخیره می کند. این جدول حاوی اطلاعاتی مانند نوع اعلان و همچنین داده های سفارشی JSON است که اعلان را توصیف می کند.

می توانید جدول را برای نمایش اعلان ها در رابط کاربری برنامه خود جستجو کنید. اما قبل از اینکه بتوانید این کار را انجام دهید، باید یک جدول پایگاه داده ایجاد کنید تا اعلان های خود را نگه دارید. می توانید از notifications:table دستور برای ایجاد یک مهاجرت با طرح جدول مناسب استفاده کنید:

php artisan notifications:table
 
php artisan migrate

قالب بندی اطلاعیه های پایگاه داده

اگر یک اعلان از ذخیره شدن در جدول پایگاه داده پشتیبانی می کند، باید یک toDatabase یا toArray متد را در کلاس اعلان تعریف کنید. این متد یک موجودیت دریافت می کند $notifiable و باید یک آرایه PHP ساده را برگرداند. آرایه برگشتی به صورت JSON کدگذاری شده و در data ستون جدول شما ذخیره می شود notifications . بیایید نگاهی به یک toArray روش مثال بیندازیم:

/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
}

toDatabase در مقابل. toArray

این toArray روش همچنین توسط broadcast کانال برای تعیین اینکه کدام داده به مشتری جاوا اسکریپت شما پخش شود استفاده می شود. اگر می خواهید دو نمایش آرایه متفاوت برای کانال database و و داشته باشید broadcast ، باید یک toDatabase متد را به جای toArray متد تعریف کنید.

دسترسی به اعلان ها

هنگامی که اعلان‌ها در پایگاه داده ذخیره می‌شوند، به یک راه راحت برای دسترسی به آن‌ها از موجودیت‌های قابل اطلاع خود نیاز دارید. این Illuminate\Notifications\Notifiable ویژگی که در مدل پیش‌فرض لاراول گنجانده شده است App\User ، شامل یک notifications رابطه Eloquent است که اعلان‌ها را برای موجودیت بازمی‌گرداند. برای واکشی اعلان‌ها، می‌توانید به این روش مانند هر رابطه Eloquent دیگری دسترسی داشته باشید. به طور پیش‌فرض، اعلان‌ها بر اساس مهر زمانی مرتب می‌شوند created_at :

$user = App\User::find(1);
 
foreach ($user->notifications as $notification) {
echo $notification->type;
}

اگر می‌خواهید فقط اعلان‌های «خوانده نشده» را بازیابی کنید، می‌توانید از unreadNotifications رابطه استفاده کنید. مجدداً، این اعلان ها بر اساس مهر زمانی مرتب می شوند created_at :

$user = App\User::find(1);
 
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
}

برای دسترسی به اعلان‌های خود از کلاینت جاوا اسکریپت، باید یک کنترل‌کننده اعلان برای برنامه خود تعریف کنید که اعلان‌ها را برای یک موجودیت اعلان‌پذیر، مانند کاربر فعلی، برمی‌گرداند. سپس می توانید یک درخواست HTTP به URI آن کنترلر از کلاینت جاوا اسکریپت خود ارسال کنید.

علامت گذاری اعلان ها به عنوان خوانده شده

به طور معمول، زمانی که کاربر یک اعلان را مشاهده می کند، می خواهید آن را به عنوان "خوانده شده" علامت گذاری کنید. این Illuminate\Notifications\Notifiable ویژگی markAsRead روشی را ارائه می دهد که read_at ستون را در رکورد پایگاه داده اعلان به روز می کند:

$user = App\User::find(1);
 
foreach ($user->unreadNotifications as $notification) {
$notification->markAsRead();
}

با این حال، به جای حلقه زدن در هر اعلان، می توانید از این markAsRead روش مستقیماً در مجموعه ای از اعلان ها استفاده کنید:

$user->unreadNotifications->markAsRead();

همچنین می‌توانید از یک درخواست به‌روزرسانی انبوه برای علامت‌گذاری همه اعلان‌ها به عنوان خوانده‌شده بدون بازیابی آنها از پایگاه داده استفاده کنید:

$user = App\User::find(1);
 
$user->unreadNotifications()->update(['read_at' => now()]);

می‌توانید delete اعلان‌ها را به‌طور کامل از جدول حذف کنید:

$user->notifications()->delete();

اطلاعیه های پخش

پیش نیازها

قبل از پخش اعلان‌ها، باید سرویس‌های پخش رویداد لاراول را پیکربندی کرده و با آن آشنا باشید . پخش رویداد راهی را برای واکنش به رویدادهای لاراول در سمت سرور از کلاینت جاوا اسکریپت شما فراهم می کند.

قالب بندی اعلان های پخش

این کانال اعلان‌ها را با استفاده از خدمات پخش رویداد broadcast لاراول پخش می‌کند و به مشتری جاوا اسکریپت شما اجازه می‌دهد تا اعلان‌ها را در زمان واقعی دریافت کند. اگر یک اعلان از پخش پشتیبانی می کند، می توانید روشی را در کلاس اعلان تعریف کنید. این روش یک موجودیت دریافت می کند و باید یک نمونه را برگرداند. اگر روش وجود نداشته باشد، از این روش برای جمع آوری داده هایی که باید پخش شوند استفاده می شود. داده های بازگردانده شده به صورت JSON کدگذاری می شوند و به سرویس گیرنده جاوا اسکریپت شما پخش می شوند. بیایید نگاهی به یک روش مثال بیندازیم: toBroadcast $notifiable BroadcastMessage toBroadcast toArray toBroadcast

use Illuminate\Notifications\Messages\BroadcastMessage;
 
/**
* Get the broadcastable representation of the notification.
*
* @param mixed $notifiable
* @return BroadcastMessage
*/
public function toBroadcast($notifiable)
{
return new BroadcastMessage([
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
]);
}

پیکربندی صف پخش

همه اعلان های پخش برای پخش در صف قرار می گیرند. اگر می‌خواهید اتصال صف یا نام صفی را که برای صف‌بندی عملیات پخش استفاده می‌شود پیکربندی کنید، می‌توانید از onConnection و onQueue روش‌های زیر استفاده کنید BroadcastMessage :

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

سفارشی کردن نوع اعلان

علاوه بر داده‌هایی که مشخص می‌کنید، همه اعلان‌های پخش همچنین دارای یک type فیلد حاوی نام کلاس کامل اعلان هستند. اگر می‌خواهید اعلان‌هایی را type که برای کلاینت جاوا اسکریپت ارائه می‌شود سفارشی کنید، می‌توانید broadcastType روشی را در کلاس اعلان تعریف کنید:

use Illuminate\Notifications\Messages\BroadcastMessage;
 
/**
* Get the type of the notification being broadcast.
*
* @return string
*/
public function broadcastType()
{
return 'broadcast.message';
}

گوش دادن برای اعلان ها

اعلان ها در یک کانال خصوصی که با استفاده از یک {notifiable}.{id} کنوانسیون قالب بندی شده است پخش می شود. App\User بنابراین، اگر برای نمونه ای با شناسه اعلان ارسال می کنید 1 ، اعلان در App.User.1 کانال خصوصی پخش می شود. هنگام استفاده از Laravel Echo ، می‌توانید به راحتی به اعلان‌های یک کانال با استفاده از notification روش کمکی گوش دهید:

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

سفارشی کردن کانال اطلاع رسانی

اگر می‌خواهید شخصی‌سازی کنید که یک نهاد قابل اطلاع در کدام کانال اعلان‌های پخش خود را دریافت می‌کند، می‌توانید روشی را receivesBroadcastNotificationsOn در نهاد قابل اطلاع تعریف کنید:

<?php
 
namespace App;
 
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable
{
use Notifiable;
 
/**
* The channels the user receives notification broadcasts on.
*
* @return string
*/
public function receivesBroadcastNotificationsOn()
{
return 'users.'.$this->id;
}
}

اعلان های پیامکی

پیش نیازها

ارسال اعلان‌های پیامکی در لاراول توسط Nexmo انجام می‌شود . قبل از اینکه بتوانید اعلان‌ها را از طریق Nexmo ارسال کنید، باید laravel/nexmo-notification-channel بسته Composer را نصب کنید:

composer require laravel/nexmo-notification-channel

با این کار بسته نیز نصب می شود nexmo/laravel . این بسته شامل فایل پیکربندی خودش است . می توانید از متغیرهای محیط NEXMO_KEY و NEXMO_SECRET برای تنظیم کلید عمومی و مخفی Nexmo خود استفاده کنید.

در مرحله بعد، باید یک گزینه پیکربندی را به config/services.php فایل پیکربندی خود اضافه کنید. برای شروع می توانید پیکربندی نمونه زیر را کپی کنید:

'nexmo' => [
'sms_from' => '15556666666',
],

گزینه sms_from شماره تلفنی است که پیامک های شما از آن ارسال می شود. شما باید یک شماره تلفن برای برنامه خود در کنترل پنل Nexmo ایجاد کنید.

قالب بندی اعلان های پیامکی

اگر یک اعلان از ارسال به صورت پیامک پشتیبانی می کند، باید toNexmo روشی را در کلاس اعلان تعریف کنید. این متد یک $notifiable موجودیت دریافت می کند و باید یک Illuminate\Notifications\Messages\NexmoMessage نمونه را برگرداند:

/**
* Get the Nexmo / SMS representation of the notification.
*
* @param mixed $notifiable
* @return NexmoMessage
*/
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your SMS message content');
}

قالب بندی اعلان های کد کوتاه

لاراول همچنین از ارسال اعلان‌های کد کوتاه، که قالب‌های پیام از پیش تعریف‌شده در حساب Nexmo شما هستند، پشتیبانی می‌کند. می‌توانید نوع اعلان ( alert , 2fa یا marketing ) و همچنین مقادیر سفارشی که قالب را پر می‌کند را مشخص کنید:

/**
* Get the Nexmo / Shortcode representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toShortcode($notifiable)
{
return [
'type' => 'alert',
'custom' => [
'code' => 'ABC123',
];
];
}

مانند مسیریابی اعلان‌های پیامکی ، باید این routeNotificationForShortcode روش را بر روی مدل قابل اطلاع خود پیاده‌سازی کنید.

محتوای یونیکد

اگر پیام اس ام اس شما حاوی کاراکترهای یونیکد است، باید unicode در هنگام ساختن NexmoMessage نمونه، متد را فراخوانی کنید:

/**
* Get the Nexmo / SMS representation of the notification.
*
* @param mixed $notifiable
* @return NexmoMessage
*/
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your unicode message')
->unicode();
}

سفارشی کردن شماره "از".

اگر می‌خواهید برخی از اعلان‌ها را از شماره تلفنی که با شماره تلفن مشخص‌شده در فایلتان متفاوت است ارسال کنید config/services.php ، می‌توانید از این from روش برای NexmoMessage نمونه استفاده کنید:

/**
* Get the Nexmo / SMS representation of the notification.
*
* @param mixed $notifiable
* @return NexmoMessage
*/
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your SMS message content')
->from('15554443333');
}

مسیریابی اعلان های پیامکی

برای هدایت اعلان‌های Nexmo به شماره تلفن مناسب، روشی را routeNotificationForNexmo در نهاد قابل اطلاع خود تعریف کنید:

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

Slack Notifications

پیش نیازها

قبل از اینکه بتوانید اعلان ها را از طریق Slack ارسال کنید، باید کانال اعلان را از طریق Composer نصب کنید:

composer require laravel/slack-notification-channel

همچنین باید یک ادغام "Incoming Webhook" را برای تیم Slack خود پیکربندی کنید. این ادغام URL را در اختیار شما قرار می دهد که می توانید هنگام مسیریابی اعلان های Slack از آن استفاده کنید .

قالب بندی Slack Notifications

اگر یک اعلان از ارسال به عنوان پیام Slack پشتیبانی می کند، باید toSlack روشی را در کلاس اعلان تعریف کنید. این روش یک $notifiable موجودیت دریافت می کند و باید یک Illuminate\Notifications\Messages\SlackMessage نمونه را برگرداند. پیام‌های شل ممکن است حاوی محتوای متنی و همچنین یک «پیوست» باشد که متن اضافی یا مجموعه‌ای از فیلدها را قالب‌بندی می‌کند. بیایید به یک toSlack مثال اساسی نگاهی بیندازیم:

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
return (new SlackMessage)
->content('One of your invoices has been paid!');
}

در این مثال ما فقط یک خط متن را به Slack می فرستیم که پیامی شبیه شکل زیر ایجاد می کند:

سفارشی کردن فرستنده و گیرنده

شما می توانید از روش from و to برای سفارشی کردن فرستنده و گیرنده استفاده کنید. متد from یک نام کاربری و شناسه ایموجی را می پذیرد، در حالی که to روش یک کانال یا نام کاربری را می پذیرد:

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
return (new SlackMessage)
->from('Ghost', ':ghost:')
->to('#other')
->content('This will be sent to #other');
}

همچنین می توانید به جای ایموجی از یک تصویر به عنوان لوگوی خود استفاده کنید:

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
return (new SlackMessage)
->from('Laravel')
->image('https://laravel.com/img/favicon/favicon.ico')
->content('This will display the Laravel logo next to the message');
}

پیوست های شل

همچنین می‌توانید «پیوست‌ها» را به پیام‌های Slack اضافه کنید. پیوست ها گزینه های قالب بندی غنی تری نسبت به پیام های متنی ساده ارائه می دهند. در این مثال، ما یک اعلان خطا در مورد استثنایی که در یک برنامه رخ داده است، از جمله پیوندی برای مشاهده جزئیات بیشتر در مورد استثنا ارسال می کنیم:

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
$url = url('/exceptions/'.$this->exception->id);
 
return (new SlackMessage)
->error()
->content('Whoops! Something went wrong.')
->attachment(function ($attachment) use ($url) {
$attachment->title('Exception: File Not Found', $url)
->content('File [background.jpg] was not found.');
});
}

مثال بالا یک پیام Slack به شکل زیر ایجاد می کند:

ضمیمه ها همچنین به شما امکان می دهند آرایه ای از داده ها را مشخص کنید که باید به کاربر ارائه شود. داده های داده شده در قالب جدولی برای خواندن آسان ارائه می شود:

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
$url = url('/invoices/'.$this->invoice->id);
 
return (new SlackMessage)
->success()
->content('One of your invoices has been paid!')
->attachment(function ($attachment) use ($url) {
$attachment->title('Invoice 1322', $url)
->fields([
'Title' => 'Server Expenses',
'Amount' => '$1,234',
'Via' => 'American Express',
'Was Overdue' => ':-1:',
]);
});
}

مثال بالا یک پیام Slack به شکل زیر ایجاد می کند:

محتوای پیوست Markdown

اگر برخی از فیلدهای پیوست شما حاوی Markdown هستند، می توانید از روشی markdown برای دستور دادن به Slack برای تجزیه و نمایش فیلدهای پیوست داده شده به عنوان متن فرمت شده Markdown استفاده کنید. مقادیر پذیرفته شده توسط این روش عبارتند از: pretext , text و / یا fields . برای اطلاعات بیشتر در مورد قالب بندی پیوست Slack، مستندات Slack API را بررسی کنید :

/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
$url = url('/exceptions/'.$this->exception->id);
 
return (new SlackMessage)
->error()
->content('Whoops! Something went wrong.')
->attachment(function ($attachment) use ($url) {
$attachment->title('Exception: File Not Found', $url)
->content('File [background.jpg] was *not found*.')
->markdown(['text']);
});
}

مسیریابی Slack Notifications

برای هدایت اعلان‌های Slack به مکان مناسب، routeNotificationForSlack روشی را بر روی موجودیت قابل اطلاع خود تعریف کنید. این باید نشانی وب هوک را که اعلان باید به آن تحویل داده شود، بازگرداند. URL های Webhook ممکن است با افزودن یک سرویس "Incoming Webhook" به تیم Slack شما ایجاد شوند:

<?php
 
namespace App;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable
{
use Notifiable;
 
/**
* Route notifications for the Slack channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return string
*/
public function routeNotificationForSlack($notification)
{
return 'https://hooks.slack.com/services/...';
}
}

بومی سازی اعلان ها

لاراول به شما این امکان را می دهد که اعلان ها را در محلی غیر از زبان فعلی ارسال کنید و حتی اگر نوتیفیکیشن در صف قرار گیرد، این منطقه را به خاطر می آورد.

برای انجام این کار، کلاس روشی برای تنظیم زبان مورد نظر Illuminate\Notifications\Notification ارائه می دهد . locale هنگامی که اعلان در حال قالب‌بندی است، برنامه به این منطقه تغییر می‌کند و پس از تکمیل قالب‌بندی، به محلی قبلی برمی‌گردد:

$user->notify((new InvoicePaid($invoice))->locale('es'));

بومی سازی چندین ورودی قابل اطلاع ممکن است از طریق Notification نما نیز حاصل شود:

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

لوکال های برگزیده کاربر

گاهی اوقات، برنامه ها محلی مورد نظر هر کاربر را ذخیره می کنند. با اجرای HasLocalePreference قرارداد بر روی مدل قابل اطلاع رسانی خود، می توانید به لاراول دستور دهید هنگام ارسال اعلان از این محلی ذخیره شده استفاده کند:

use Illuminate\Contracts\Translation\HasLocalePreference;
 
class User extends Model implements HasLocalePreference
{
/**
* Get the user's preferred locale.
*
* @return string
*/
public function preferredLocale()
{
return $this->locale;
}
}

هنگامی که رابط را پیاده سازی کردید، لاراول به طور خودکار از محلی ترجیحی در هنگام ارسال اعلان ها و فایل های پستی به مدل استفاده می کند. locale بنابراین، هنگام استفاده از این رابط، نیازی به فراخوانی متد نیست :

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

رویدادهای اطلاع رسانی

هنگامی که یک اعلان ارسال می شود، Illuminate\Notifications\Events\NotificationSent رویداد توسط سیستم اطلاع رسانی فعال می شود. این شامل نهاد "اعلان پذیر" و خود نمونه اعلان است. شما می توانید شنوندگان را برای این رویداد در سایت خود ثبت کنید EventServiceProvider :

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Notifications\Events\NotificationSent' => [
'App\Listeners\LogNotification',
],
];

پس از ثبت شنوندگان در خود EventServiceProvider ، از event:generate دستور Artisan برای تولید سریع کلاس های شنونده استفاده کنید.

در شنونده رویداد، می‌توانید به notifiable , notification و channel ویژگی‌های رویداد دسترسی داشته باشید تا درباره گیرنده اعلان یا خود اعلان بیشتر بدانید:

/**
* Handle the event.
*
* @param NotificationSent $event
* @return void
*/
public function handle(NotificationSent $event)
{
// $event->channel
// $event->notifiable
// $event->notification
// $event->response
}

کانال های سفارشی

لاراول با تعداد انگشت شماری کانال اعلان عرضه می شود، اما ممکن است بخواهید درایورهای خود را برای ارسال اعلان ها از طریق کانال های دیگر بنویسید. لاراول آن را ساده می کند. برای شروع، کلاسی را تعریف کنید که حاوی send متد باشد. متد باید دو آرگومان دریافت کند: a $notifiable و a $notification :

<?php
 
namespace App\Channels;
 
use Illuminate\Notifications\Notification;
 
class VoiceChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return void
*/
public function send($notifiable, Notification $notification)
{
$message = $notification->toVoice($notifiable);
 
// Send notification to the $notifiable instance...
}
}

هنگامی که کلاس کانال اطلاع رسانی شما تعریف شد، می توانید نام کلاس را از via روش هر یک از اعلان های خود برگردانید:

<?php
 
namespace App\Notifications;
 
use App\Channels\Messages\VoiceMessage;
use App\Channels\VoiceChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
 
class InvoicePaid extends Notification
{
use Queueable;
 
/**
* Get the notification channels.
*
* @param mixed $notifiable
* @return array|string
*/
public function via($notifiable)
{
return [VoiceChannel::class];
}
 
/**
* Get the voice representation of the notification.
*
* @param mixed $notifiable
* @return VoiceMessage
*/
public function toVoice($notifiable)
{
// ...
}
}