اطلاعیه
- معرفی
- ایجاد اعلان ها
- ارسال اعلان ها
- اعلان های پستی
- اعلانهای ایمیل Markdown
- اطلاعیه های پایگاه داده
- اطلاعیه های پخش
- اعلان های پیامکی
- Slack Notifications
- بومی سازی اعلان ها
- آزمایش کردن
- رویدادهای اطلاع رسانی
- کانال های سفارشی
معرفی
لاراول علاوه بر پشتیبانی از ارسال ایمیل ، از ارسال اعلانها در انواع کانالهای تحویل، از جمله ایمیل، پیامک (از طریق 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 { // ... }}