نسخه:

اطلاعیه

معرفی

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

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

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

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

php artisan make:notification InvoicePaid

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

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

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

اعلان ها ممکن است به دو صورت ارسال شوند: با استفاده از notify روش صفت Notifiable یا استفاده از Notification نما . این Notifiable ویژگی به طور پیش فرض در مدل برنامه شما گنجانده شده است App\Models\User :

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

روش notify ارائه شده توسط این ویژگی انتظار دارد که یک نمونه اعلان دریافت کند:

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

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

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

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

use Illuminate\Support\Facades\Notification;
 
Notification::send($users, new InvoicePaid($invoice));

همچنین می توانید با استفاده از sendNow روش فوراً اعلان ارسال کنید. این روش بلافاصله اعلان را ارسال می کند حتی اگر اعلان ShouldQueue رابط را پیاده سازی کند:

Notification::sendNow($developers, new DeploymentCompleted($deployment));

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

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

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

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

/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return $notifiable->prefers_sms ? ['vonage'] : ['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 به نمونه اعلان خود زنجیره بزنید:

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

تاخیر در اعلان ها در هر کانال

می توانید یک آرایه را به delay متد ارسال کنید تا مقدار تاخیر را برای کانال های خاص مشخص کنید:

$user->notify((new InvoicePaid($invoice))->delay([
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
]));

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

/**
* Determine the notification's delivery delay.
*
* @return array<string, \Illuminate\Support\Carbon>
*/
public function withDelay(object $notifiable): array
{
return [
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
];
}

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

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

<?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;
 
/**
* Create a new notification instance.
*/
public function __construct()
{
$this->onConnection('redis');
}
}

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

/**
* Determine which connections should be used for each notification channel.
*
* @return array<string, string>
*/
public function viaConnections(): array
{
return [
'mail' => 'redis',
'database' => 'sync',
];
}

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

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

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

اعلان های صف و معاملات پایگاه داده

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

اگر گزینه پیکربندی اتصال صف شما after_commit روی تنظیم شده باشد ، همچنان ممکن است با فراخوانی روش هنگام ارسال اعلان، false نشان دهید که یک اعلان صف خاص باید پس از انجام تمام تراکنش‌های پایگاه داده باز ارسال شود : afterCommit

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

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

<?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;
 
/**
* Create a new notification instance.
*/
public function __construct()
{
$this->afterCommit();
}
}

برای کسب اطلاعات بیشتر در مورد کار در مورد این مسائل، لطفاً اسناد مربوط به مشاغل در صف و تراکنش های پایگاه داده را مرور کنید .

تعیین اینکه آیا یک اعلان در صف باید ارسال شود

پس از اینکه یک اعلان در صف برای پردازش پس‌زمینه ارسال شد، معمولاً توسط یک کارگر صف پذیرفته می‌شود و برای گیرنده مورد نظر ارسال می‌شود.

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

/**
* Determine if the notification should be sent.
*/
public function shouldSend(object $notifiable, string $channel): bool
{
return $this->invoice->isPaid();
}

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

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

use Illuminate\Broadcasting\Channel;
use Illuminate\Support\Facades\Notification;
 
Notification::route('mail', 'taylor@example.com')
->route('vonage', '5555555555')
->route('slack', '#slack-channel')
->route('broadcast', [new Channel('channel-name')])
->notify(new InvoicePaid($invoice));

اگر می‌خواهید هنگام ارسال اعلان درخواستی به mail مسیر، نام گیرنده را ارائه کنید، می‌توانید آرایه‌ای ارائه کنید که آدرس ایمیل را به عنوان کلید و نام را به عنوان مقدار عنصر اول در آرایه در بر دارد:

Notification::route('mail', [
'barrett@example.com' => 'Barrett Blair',
])->notify(new InvoicePaid($invoice));

با استفاده از این routes روش، می توانید اطلاعات مسیریابی موقت را برای چندین کانال اعلان به طور همزمان ارائه دهید:

Notification::routes([
'mail' => ['barrett@example.com' => 'Barrett Blair'],
'vonage' => '5555555555',
])->notify(new InvoicePaid($invoice));

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

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

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

این MailMessage کلاس شامل چند روش ساده برای کمک به شما در ساخت پیام‌های ایمیل تراکنشی است. پیام‌های ایمیل ممکن است حاوی خطوط متنی و همچنین یک «تماس برای اقدام» باشند. بیایید نگاهی به یک toMail روش مثال بیندازیم:

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
$url = url('/invoice/'.$this->invoice->id);
 
return (new MailMessage)
->greeting('Hello!')
->line('One of your invoices has been paid!')
->lineIf($this->amount > 0, "Amount paid: {$this->amount}")
->action('View Invoice', $url)
->line('Thank you for using our application!');
}

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

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

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

پیغام خطا

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->error()
->subject('Invoice Payment Failed')
->line('...');
}

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

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
'mail.invoice.paid', ['invoice' => $this->invoice]
);
}

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
['mail.invoice.paid', 'mail.invoice.paid-text'],
['invoice' => $this->invoice]
);
}

یا اگر پیام شما فقط نمای متنی دارد، می توانید از text روش زیر استفاده کنید:

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->text(
'mail.invoice.paid-text', ['invoice' => $this->invoice]
);
}

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

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->from('barrett@example.com', 'Barrett Blair')
->line('...');
}

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

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

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

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

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}

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

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->mailer('postmark')
->line('...');
}

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

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

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

پیوست ها

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

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file');
}

روش attach ارائه شده توسط پیام های ایمیل اعلان نیز اشیاء قابل پیوست را می پذیرد . لطفاً برای کسب اطلاعات بیشتر به مستندات شیء قابل پیوست جامع مراجعه کنید .

هنگام پیوست کردن فایل‌ها به پیام، می‌توانید نام نمایشی و/یا نوع MIME را با ارسال یک array آرگومان دوم به attach روش مشخص کنید:

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file', [
'as' => 'name.pdf',
'mime' => 'application/pdf',
]);
}

برخلاف پیوست کردن فایل‌ها در اشیاء پست‌پذیر، نمی‌توانید فایلی را مستقیماً از دیسک ذخیره‌سازی با استفاده از ضمیمه کنید attachFromStorage . بهتر است از attach روشی با یک مسیر مطلق به فایل روی دیسک ذخیره سازی استفاده کنید. از طرف دیگر، می توانید یک mailable را از toMail روش برگردانید:

use App\Mail\InvoicePaid as InvoicePaidMailable;
 
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): Mailable
{
return (new InvoicePaidMailable($this->invoice))
->to($notifiable->email)
->attachFromStorage('/path/to/file');
}

در صورت لزوم، ممکن است چندین فایل با استفاده از روش زیر به یک پیام پیوست شود attachMany :

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attachMany([
'/path/to/forge.svg',
'/path/to/vapor.svg' => [
'as' => 'Logo.svg',
'mime' => 'image/svg+xml',
],
]);
}

پیوست های داده های خام

این attachData روش ممکن است برای پیوست کردن یک رشته خام از بایت ها به عنوان پیوست استفاده شود. هنگام فراخوانی attachData متد، باید نام فایلی را که باید به پیوست اختصاص داده شود ارائه دهید:

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attachData($this->pdf, 'name.pdf', [
'mime' => 'application/pdf',
]);
}

اضافه کردن برچسب ها و متادیتا

برخی از ارائه‌دهندگان ایمیل شخص ثالث مانند Mailgun و Postmark از پیام‌های "برچسب‌ها" و "متاداده" پشتیبانی می‌کنند، که ممکن است برای گروه‌بندی و ردیابی ایمیل‌های ارسال شده توسط برنامه شما استفاده شوند. می‌توانید برچسب‌ها و ابرداده‌ها را از طریق tag و metadata روش‌های زیر به یک پیام ایمیل اضافه کنید:

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Comment Upvoted!')
->tag('upvote')
->metadata('comment_id', $this->comment->id);
}

اگر برنامه شما از درایور Mailgun استفاده می کند، می توانید برای اطلاعات بیشتر در مورد برچسب ها و ابرداده ها به اسناد Mailgun مراجعه کنید . به همین ترتیب، ممکن است برای اطلاعات بیشتر در مورد پشتیبانی آن‌ها از برچسب‌ها و ابرداده، از اسناد Postmark نیز استفاده شود .

اگر برنامه شما از آمازون SES برای ارسال ایمیل استفاده می کند، باید از metadata روشی برای پیوست کردن "برچسب ها" SES به پیام استفاده کنید.

سفارشی کردن پیام Symfony

متد withSymfonyMessage کلاس MailMessage به شما اجازه می دهد تا یک بسته را ثبت کنید که قبل از ارسال پیام با نمونه پیام Symfony فراخوانی می شود. این به شما فرصتی می دهد تا پیام را قبل از تحویل عمیقاً شخصی سازی کنید:

use Symfony\Component\Mime\Email;
 
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->withSymfonyMessage(function (Email $message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
}

استفاده از Mailables

در صورت نیاز، می توانید یک شیء قابل ارسال کامل را از روش اعلان خود برگردانید toMail . هنگام برگرداندن a Mailable به جای a MailMessage ، باید گیرنده پیام را با استفاده از to روش شیء ارسالی مشخص کنید:

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

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

اگر در حال ارسال اعلان درخواستی هستید ، $notifiable نمونه ای که به toMail روش داده شده است نمونه ای از روشی Illuminate\Notifications\AnonymousNotifiable است که routeNotificationFor ممکن است برای بازیابی آدرس ایمیلی که اعلان درخواستی باید به آن ارسال شود، استفاده شود:

use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Mail\Mailable;
 
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): Mailable
{
$address = $notifiable instanceof AnonymousNotifiable
? $notifiable->routeNotificationFor('mail')
: $notifiable->email;
 
return (new InvoicePaidMailable($this->invoice))
->to($address);
}

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

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

use App\Models\Invoice;
use App\Notifications\InvoicePaid;
 
Route::get('/notification', function () {
$invoice = Invoice::find(1);
 
return (new 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.
*/
public function toMail(object $notifiable): MailMessage
{
$url = url('/invoice/'.$this->invoice->id);
 
return (new MailMessage)
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}

نوشتن پیام

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

<x-mail::message>
# Invoice Paid
 
Your invoice has been paid!
 
<x-mail::button :url="$url">
View Invoice
</x-mail::button>
 
Thanks,<br>
{{ config('app.name') }}
</x-mail::message>

جزء دکمه

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

<x-mail::button :url="$url" color="green">
View Invoice
</x-mail::button>

جزء پنل

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

<x-mail::panel>
This is the panel content.
</x-mail::panel>

جزء جدول

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

<x-mail::table>
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
</x-mail::table>

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

شما می توانید تمام اجزای اعلان 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.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->theme('invoice')
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}

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

پیش نیازها

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

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

php artisan make:notifications-table
 
php artisan migrate

اگر مدل‌های قابل اعلان شما از کلیدهای اولیه UUID یا ULID استفاده می‌کنند ، باید morphs روش را با uuidMorphs یا ulidMorphs در انتقال جدول اعلان جایگزین کنید.

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

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

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

هنگامی که اعلان در پایگاه داده برنامه شما ذخیره می شود، type ستون با نام کلاس اعلان پر می شود. با این حال، می توانید این رفتار را با تعریف databaseType روشی در کلاس اعلان خود سفارشی کنید:

/**
* Get the notification's database type.
*
* @return string
*/
public function databaseType(object $notifiable): string
{
return 'invoice-paid';
}

toDatabase در مقابل. toArray

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

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

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

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

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

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

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

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

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

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

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

$user->unreadNotifications->markAsRead();

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

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

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

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

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

پیش نیازها

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

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

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

use Illuminate\Notifications\Messages\BroadcastMessage;
 
/**
* Get the broadcastable representation of the notification.
*/
public function toBroadcast(object $notifiable): BroadcastMessage
{
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 روشی را در کلاس اعلان تعریف کنید:

/**
* Get the type of the notification being broadcast.
*/
public function broadcastType(): string
{
return 'broadcast.message';
}

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

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

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

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

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

<?php
 
namespace App\Models;
 
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.
*/
public function receivesBroadcastNotificationsOn(): string
{
return 'users.'.$this->id;
}
}

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

پیش نیازها

ارسال اعلان‌های پیامکی در لاراول توسط Vonage (که قبلاً Nexmo نامیده می‌شد) پشتیبانی می‌شود. قبل از اینکه بتوانید اعلان‌ها را از طریق Vonage ارسال کنید، باید بسته‌های laravel/vonage-notification-channel و را نصب کنید guzzlehttp/guzzle :

composer require laravel/vonage-notification-channel guzzlehttp/guzzle

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

پس از تعریف کلیدهای خود، باید یک VONAGE_SMS_FROM متغیر محیطی تنظیم کنید که شماره تلفنی را که پیام های SMS شما باید از آن ارسال شود، به طور پیش فرض تعیین می کند. می توانید این شماره تلفن را در کنترل پنل Vonage ایجاد کنید:

VONAGE_SMS_FROM=15556666666

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

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

use Illuminate\Notifications\Messages\VonageMessage;
 
/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content');
}

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

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

use Illuminate\Notifications\Messages\VonageMessage;
 
/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your unicode message')
->unicode();
}

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

اگر می‌خواهید اعلان‌هایی از شماره تلفنی که با شماره تلفن مشخص‌شده توسط VONAGE_SMS_FROM متغیر محیطی شما متفاوت است ارسال کنید، می‌توانید from در یک VonageMessage نمونه از روش تماس بگیرید:

use Illuminate\Notifications\Messages\VonageMessage;
 
/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content')
->from('15554443333');
}

اضافه کردن یک مرجع مشتری

اگر می‌خواهید هزینه‌های هر کاربر، تیم یا مشتری را پیگیری کنید، می‌توانید «مرجع مشتری» را به اعلان اضافه کنید. Vonage به شما این امکان را می دهد که با استفاده از این مرجع مشتری گزارش تولید کنید تا بتوانید میزان استفاده از پیامک مشتری خاص را بهتر درک کنید. مرجع مشتری می تواند هر رشته ای تا 40 کاراکتر باشد:

use Illuminate\Notifications\Messages\VonageMessage;
 
/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->clientReference((string) $notifiable->id)
->content('Your SMS message content');
}

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

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

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

Slack Notifications

پیش نیازها

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

composer require laravel/slack-notification-channel

علاوه بر این، باید یک برنامه Slack برای فضای کاری Slack خود ایجاد کنید.

اگر فقط نیاز به ارسال اعلان‌ها به همان فضای کاری Slack دارید که برنامه در آن ایجاد شده است، باید مطمئن شوید که برنامه شما دارای chat:write , chat:write.public و chat:write.customize دامنه است. این دامنه ها را می توان از برگه مدیریت برنامه "OAuth & Permissions" در Slack اضافه کرد.

سپس، "Bot User OAuth Token" برنامه را کپی کنید و آن را در یک slack آرایه پیکربندی در فایل پیکربندی برنامه خود قرار دهید services.php . این نشانه را می توان در برگه "OAuth & Permissions" در Slack یافت:

'slack' => [
'notifications' => [
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
],
],

توزیع برنامه

اگر برنامه شما اعلان هایی را به فضاهای کاری خارجی Slack که متعلق به کاربران برنامه شما هستند ارسال می کند، باید برنامه خود را از طریق Slack "توزیع" کنید. توزیع برنامه را می توان از برگه "مدیریت توزیع" برنامه شما در Slack مدیریت کرد. هنگامی که برنامه شما توزیع شد، می توانید از Socialite برای دریافت نشانه های Slack Bot از طرف کاربران برنامه خود استفاده کنید.

قالب بندی Slack Notifications

اگر یک اعلان از ارسال به عنوان پیام Slack پشتیبانی می کند، باید toSlack روشی را در کلاس اعلان تعریف کنید. این متد یک $notifiable موجودیت دریافت می کند و باید یک Illuminate\Notifications\Slack\SlackMessage نمونه را برگرداند. می‌توانید با استفاده از Slack's Block Kit API اعلان‌های غنی بسازید . مثال زیر ممکن است در سازنده Slack's Block Kit پیش نمایش داده شود :

use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;
use Illuminate\Notifications\Slack\SlackMessage;
 
/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
$block->field("*Invoice No:*\n1000")->markdown();
$block->field("*Invoice Recipient:*\ntaylor@laravel.com")->markdown();
})
->dividerBlock()
->sectionBlock(function (SectionBlock $block) {
$block->text('Congratulations!');
});
}

Slack Interactivity

سیستم اطلاع رسانی Slack's Block Kit ویژگی های قدرتمندی را برای مدیریت تعامل با کاربر ارائه می دهد . برای استفاده از این ویژگی‌ها، برنامه Slack شما باید «Interactivity» را فعال کرده و یک «URL درخواست» پیکربندی شده باشد که به URL ارائه‌شده توسط برنامه شما اشاره می‌کند. این تنظیمات را می توان از برگه مدیریت برنامه «Interactivity & Shortcuts» در Slack مدیریت کرد.

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

use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\SlackMessage;
 
/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
})
->actionsBlock(function (ActionsBlock $block) {
// ID defaults to "button_acknowledge_invoice"...
$block->button('Acknowledge Invoice')->primary();
 
// Manually configure the ID...
$block->button('Deny')->danger()->id('deny_invoice');
});
}

مدال های تایید

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

use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;
use Illuminate\Notifications\Slack\SlackMessage;
 
/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
})
->actionsBlock(function (ActionsBlock $block) {
$block->button('Acknowledge Invoice')
->primary()
->confirm(
'Acknowledge the payment and send a thank you email?',
function (ConfirmObject $dialog) {
$dialog->confirm('Yes');
$dialog->deny('No');
}
);
});
}

بازرسی بلوک های شل

اگر می‌خواهید بلوک‌هایی را که ساخته‌اید به‌سرعت بررسی کنید، می‌توانید dd متد موجود در SlackMessage نمونه را فراخوانی کنید. این روش یک URL را به Slack's Block Kit Builder dd تولید می‌کند که پیش‌نمایش بار و اعلان را در مرورگر شما نمایش می‌دهد. می توانید از روش تخلیه بار خام عبور کنید: true dd

return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->dd();

مسیریابی Slack Notifications

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

  • null - که مسیریابی را به کانال پیکربندی شده در خود اعلان به تعویق می اندازد. to هنگام ساختن خود می توانید از این روش SlackMessage برای پیکربندی کانال در اعلان استفاده کنید.
  • رشته ای که کانال Slack را برای ارسال اعلان مشخص می کند، به عنوان مثال #support-channel .
  • نمونه ای SlackRoute که به شما امکان می دهد یک نشانه OAuth و نام کانال را مشخص کنید، به عنوان مثال SlackRoute::make($this->slack_channel, $this->slack_token) . این روش باید برای ارسال اعلان ها به فضاهای کاری خارجی استفاده شود.

به عنوان مثال، بازگشت #support-channel از routeNotificationForSlack روش، اعلان را به کانال موجود در فضای کاری مرتبط با توکن کاربر ربات OAuth واقع در فایل پیکربندی #support-channel برنامه شما ارسال می کند: services.php

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
 
class User extends Authenticatable
{
use Notifiable;
 
/**
* Route notifications for the Slack channel.
*/
public function routeNotificationForSlack(Notification $notification): mixed
{
return '#support-channel';
}
}

اطلاع رسانی به فضاهای کاری Slack خارجی

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

البته، اغلب می خواهید اعلان هایی را به فضاهای کاری Slack متعلق به کاربران برنامه خود ارسال کنید. برای انجام این کار، ابتدا باید یک توکن Slack OAuth برای کاربر دریافت کنید. خوشبختانه، Laravel Socialite دارای یک درایور Slack است که به شما این امکان را می دهد تا به راحتی کاربران برنامه خود را با Slack احراز هویت کنید و یک توکن ربات دریافت کنید .

هنگامی که توکن ربات را دریافت کردید و آن را در پایگاه داده برنامه خود ذخیره کردید، می توانید از این SlackRoute::make روش برای هدایت یک اعلان به فضای کاری کاربر استفاده کنید. علاوه بر این، برنامه شما احتمالاً باید فرصتی را برای کاربر ارائه دهد تا مشخص کند اعلان‌های کانال باید به کدام کانال ارسال شوند:

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Slack\SlackRoute;
 
class User extends Authenticatable
{
use Notifiable;
 
/**
* Route notifications for the Slack channel.
*/
public function routeNotificationForSlack(Notification $notification): mixed
{
return SlackRoute::make($this->slack_channel, $this->slack_token);
}
}

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

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

برای انجام این کار، کلاس روشی برای تنظیم زبان مورد نظر 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.
*/
public function preferredLocale(): string
{
return $this->locale;
}
}

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

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

آزمایش کردن

می توانید از روش Notification نما fake برای جلوگیری از ارسال اعلان ها استفاده کنید. به طور معمول، ارسال اعلان‌ها با کدی که واقعاً آزمایش می‌کنید ارتباطی ندارد. به احتمال زیاد، کافی است به سادگی ادعا کنیم که لاراول به ارسال یک اعلان داده شده دستور داده شده است.

پس از فراخوانی روش Notification نما fake ، می‌توانید ادعا کنید که اعلان‌ها برای ارسال به کاربران دستور داده شده است و حتی داده‌های دریافتی اعلان‌ها را بررسی کنید:

<?php
 
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
 
test('orders can be shipped', function () {
Notification::fake();
 
// Perform order shipping...
 
// Assert that no notifications were sent...
Notification::assertNothingSent();
 
// Assert a notification was sent to the given users...
Notification::assertSentTo(
[$user], OrderShipped::class
);
 
// Assert a notification was not sent...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);
 
// Assert that a given number of notifications were sent...
Notification::assertCount(3);
});
<?php
 
namespace Tests\Feature;
 
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped(): void
{
Notification::fake();
 
// Perform order shipping...
 
// Assert that no notifications were sent...
Notification::assertNothingSent();
 
// Assert a notification was sent to the given users...
Notification::assertSentTo(
[$user], OrderShipped::class
);
 
// Assert a notification was not sent...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);
 
// Assert that a given number of notifications were sent...
Notification::assertCount(3);
}
}

assertSentTo شما می‌توانید روش‌های یا روش‌های بسته را بپذیرید assertNotSentTo تا ادعا کنید اعلانی ارسال شده است که در یک "تست حقیقت" معین گذرانده شده است. اگر حداقل یک اعلان ارسال شده باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، ادعا موفقیت آمیز خواهد بود:

Notification::assertSentTo(
$user,
function (OrderShipped $notification, array $channels) use ($order) {
return $notification->order->id === $order->id;
}
);

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

اگر کدی که آزمایش می‌کنید اعلان‌های درخواستی ارسال می‌کند ، می‌توانید آزمایش کنید که اعلان درخواستی از طریق assertSentOnDemand روش زیر ارسال شده است:

Notification::assertSentOnDemand(OrderShipped::class);

با ارسال یک بسته به عنوان آرگومان دوم برای assertSentOnDemand متد، می توانید تعیین کنید که آیا یک اعلان درخواستی به آدرس صحیح "مسیر" ارسال شده است یا خیر:

Notification::assertSentOnDemand(
OrderShipped::class,
function (OrderShipped $notification, array $channels, object $notifiable) use ($user) {
return $notifiable->routes['mail'] === $user->email;
}
);

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

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

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

use Illuminate\Notifications\Events\NotificationSending;
 
class CheckNotificationStatus
{
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// ...
}
}

اگر شنونده رویداد برای رویداد از روش خود NotificationSending بازگردد، اعلان ارسال نخواهد شد : false handle

/**
* Handle the given event.
*/
public function handle(NotificationSending $event): bool
{
return false;
}

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

/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
}

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

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

use Illuminate\Notifications\Events\NotificationSent;
 
class LogNotification
{
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// ...
}
}

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

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

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

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

در این send روش، می‌توانید روش‌هایی را در اعلان فراخوانی کنید تا یک شیء پیام را که توسط کانال شما قابل درک است بازیابی کنید و سپس اعلان را $notifiable هر طور که می‌خواهید به نمونه ارسال کنید:

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

هنگامی که کلاس کانال اطلاع رسانی شما تعریف شد، می توانید نام کلاس را از via روش هر یک از اعلان های خود برگردانید. در این مثال، toVoice روش اعلان شما می‌تواند هر شیئی را که برای نمایش پیام‌های صوتی انتخاب می‌کنید، برگرداند. برای مثال، ممکن است کلاس خود را VoiceMessage برای نمایش این پیام ها تعریف کنید:

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