در بسیاری از پروژههای وب، لازم است بعد از وقوع یک اتفاق، کاربر را از آن مطلع کنیم. برای مثال، بعد از ثبت سفارش باید به کاربر اطلاع داده شود، هنگام تغییر وضعیت سفارش یک پیام برای او ارسال شود یا زمانی که موجودی حساب کاهش پیدا کرد، یک اعلان در پنل کاربری نمایش داده شود.
در یک پروژه ساده ممکن است این کار را مستقیماً با ارسال ایمیل یا ذخیره یک رکورد در دیتابیس انجام دهیم؛ اما با بزرگتر شدن پروژه، مدیریت روشهای مختلف اطلاعرسانی پیچیده میشود.
Laravel برای حل این مشکل یک سیستم داخلی به نام Notification در اختیار توسعهدهندگان قرار میدهد.
Notification در Laravel به شما اجازه میدهد منطق اعلان را یکبار تعریف کنید و مشخص کنید این اعلان از چه کانالهایی مانند ایمیل یا دیتابیس ارسال شود.
در این مقاله یاد میگیریم:
- Notification در Laravel چیست؟
- چه تفاوتی با Mail دارد؟
- چگونه یک Notification بسازیم؟
- چگونه Notification را برای کاربر ارسال کنیم؟
- چگونه اعلانها را در دیتابیس ذخیره کنیم؟
- چگونه اعلانهای خواندهشده و خواندهنشده را مدیریت کنیم؟
- چگونه چند کانال مختلف برای یک Notification تعریف کنیم؟
- چگونه Notification را به Queue منتقل کنیم؟
- چگونه یک سیستم اعلان واقعی برای تغییر وضعیت سفارش بسازیم؟
Notification در Laravel چیست؟
Notification یا سیستم اعلان در Laravel قابلیتی است که برای اطلاعرسانی به کاربران استفاده میشود.
فرض کنید در یک فروشگاه اینترنتی کاربر سفارشی ثبت کرده است. پس از ثبت سفارش ممکن است بخواهیم:
- یک ایمیل برای کاربر ارسال کنیم.
- یک اعلان داخل پنل کاربری ذخیره کنیم.
- بعداً یک پیام از طریق کانال دیگری ارسال کنیم.
به جای اینکه برای هرکدام از این موارد منطق جداگانهای بنویسیم، میتوانیم یک Notification ایجاد کنیم و کانالهای مورد نیاز را در همان Notification مشخص کنیم.
برای مثال:
Order Created
│
▼
OrderCreatedNotification
│
├── Mail
│
└── Database
در این حالت یک رویداد میتواند باعث ایجاد یک Notification شود و Notification خودش مشخص کند که اطلاعرسانی از چه روشهایی انجام شود.
چرا از Notification در Laravel استفاده کنیم؟
یکی از مهمترین مزایای Notification این است که منطق اطلاعرسانی را از بخش اصلی برنامه جدا میکند.
برای مثال، در Controller بهتر است مستقیماً تمام کد مربوط به ارسال ایمیل، ذخیره اعلان و مدیریت کانالها را قرار ندهیم.
به جای چنین ساختاری:
public function updateOrder()
{
// update order
// send email
// save notification
// send SMS
// ...
}
میتوانیم از Notification استفاده کنیم:
$user->notify(new OrderStatusChanged($order));
در نتیجه Controller سادهتر و قابل نگهداریتر خواهد بود.
# تفاوت Notification و Mail در Laravel چیست؟
Laravel برای ارسال ایمیل سیستم Mail و Mailable را دارد و در مقاله قبلی بهصورت کامل آن را بررسی کردیم.
Notification مفهوم گستردهتری دارد.
Mail بیشتر روی ساخت و ارسال ایمیل تمرکز دارد؛ اما Notification برای ایجاد یک سیستم اطلاعرسانی طراحی شده است و میتواند از چند کانال مختلف استفاده کند.
برای مثال:
| قابلیت | Notification | |
|---|---|---|
| ارسال ایمیل | بله | بله |
| ذخیره اعلان در Database | خیر، بهصورت مستقیم | بله |
| چند کاناله بودن | محدود | بله |
| اعلان داخل پنل | خیر | بله |
| مدیریت Read/Unread | ندارد | دارد |
| مناسب سیستم اعلان | متوسط | بسیار مناسب |
| Queue | بله | بله |
بنابراین اگر فقط قصد ارسال یک ایمیل دارید، Mailable انتخاب مناسبی است.
اما اگر قصد دارید یک سیستم اطلاعرسانی برای کاربران ایجاد کنید، Notification انتخاب مناسبتری است.
# ساخت اولین Notification در Laravel
برای ساخت Notification میتوانیم از Artisan استفاده کنیم.
دستور زیر را اجرا کنید:
php artisan make:notification OrderCreated
Laravel کلاس Notification را ایجاد میکند.
معمولاً فایل ایجادشده در مسیر زیر قرار میگیرد:
app/Notifications/OrderCreated.php
ساختار اولیه کلاس تقریباً به شکل زیر است:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
class OrderCreated extends Notification
{
use Queueable;
public function __construct()
{
//
}
public function via(object $notifiable): array
{
return [];
}
}
مهمترین متدی که در این کلاس با آن سروکار داریم، via() است.
# متد via در Notification چیست؟
متد via() مشخص میکند Notification از چه کانالهایی ارسال شود.
برای مثال:
public function via(object $notifiable): array
{
return ['mail'];
}
یعنی این Notification از طریق Mail ارسال خواهد شد.
اگر بخواهیم اعلان هم در Mail و هم در Database ذخیره شود:
public function via(object $notifiable): array
{
return ['mail', 'database'];
}
در این حالت Laravel هر دو کانال را پردازش میکند.
# کانالهای Notification در Laravel
Laravel از کانالهای مختلفی برای Notification پشتیبانی میکند.
از مهمترین کانالها میتوان به موارد زیر اشاره کرد:
maildatabasebroadcastvonageslack
البته بسته به نوع پروژه میتوان کانالهای سفارشی یا سرویسهای خارجی را نیز اضافه کرد.
برای یک پروژه معمولی، دو کانال بسیار مهم عبارتاند از:
mail
database
# استفاده از Notifiable در Model کاربر
برای اینکه یک Model بتواند Notification دریافت کند، معمولاً از Trait به نام Notifiable استفاده میکنیم.
در Model کاربر:
use Illuminate\Notifications\Notifiable;
و سپس:
class User extends Authenticatable
{
use Notifiable;
}
با این کار میتوانیم Notification را مستقیماً برای User ارسال کنیم.
برای مثال:
$user->notify(new OrderCreated());
# ارسال Notification با notify
سادهترین روش ارسال Notification استفاده از متد notify() است.
مثلاً:
$user->notify(new OrderCreated());
در اینجا:
$userدریافتکننده اعلان است.OrderCreatedنوع Notification است.
اگر Notification شامل اطلاعات سفارش باشد، میتوانیم آن را هنگام ساخت ارسال کنیم.
مثلاً:
$user->notify(
new OrderCreated($order)
);
# ارسال Notification با Notification::send
روش دیگری نیز برای ارسال Notification وجود دارد.
ابتدا Facade مربوطه را وارد میکنیم:
use Illuminate\Support\Facades\Notification;
سپس:
Notification::send(
$users,
new OrderCreated($order)
);
این روش زمانی مفید است که بخواهیم یک Notification را برای چند کاربر ارسال کنیم.
مثلاً:
Notification::send(
User::where('is_admin', true)->get(),
new OrderCreated($order)
);
در این مثال Notification برای کاربران مدیر ارسال میشود.
# ساخت Notification برای یک سفارش
حالا یک مثال واقعیتر ایجاد کنیم.
فرض کنید بعد از ثبت سفارش میخواهیم Notification زیر برای کاربر ارسال شود:
> سفارش شما با موفقیت ثبت شد.
ابتدا:
php artisan make:notification OrderCreated
سپس کلاس را به شکل زیر تغییر میدهیم:
<?php
namespace App\Notifications;
use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class OrderCreated extends Notification
{
use Queueable;
public function __construct(
public Order $order
) {
}
public function via(object $notifiable): array
{
return ['mail'];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('ثبت موفق سفارش')
->greeting('سلام ' . $notifiable->name)
->line('سفارش شما با موفقیت ثبت شد.')
->line('شماره سفارش: ' . $this->order->id)
->action(
'مشاهده سفارش',
url('/orders/' . $this->order->id)
)
->line('از خرید شما متشکریم.');
}
}
حالا میتوانیم بعد از ایجاد سفارش بنویسیم:
$user->notify(new OrderCreated($order));
Notification اطلاعات سفارش را دریافت میکند و ایمیل مناسب را تولید میکند.
# متد toMail چیست؟
اگر در via() کانال mail را مشخص کنیم، میتوانیم از متد toMail() برای ساخت Notification ایمیلی استفاده کنیم.
مثلاً:
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('عنوان اعلان')
->line('متن اعلان');
}
در این قسمت میتوانیم مواردی مانند:
- Subject
- Greeting
- متن پیام
- دکمه
- اطلاعات تکمیلی
را مشخص کنیم.
جزئیات مربوط به تنظیم SMTP، Mail Configuration و زیرساخت ارسال ایمیل در مقاله Mail در Laravel بررسی شده است.
# Notification از طریق Database
یکی از کاربردیترین امکانات Notification، ذخیره اعلان در دیتابیس است.
این قابلیت به ما اجازه میدهد اعلانهایی مانند موارد زیر را داخل پنل کاربر نمایش دهیم:
سفارش شما ثبت شد.
پرداخت شما با موفقیت انجام شد.
سفارش شما ارسال شد.
موجودی کیف پول شما کاهش یافت.
تیکت شما پاسخ داده شد.
برای این کار باید کانال database را فعال کنیم.
# ساخت جدول Notifications
Laravel برای ذخیره Database Notification از جدول notifications استفاده میکند.
برای ایجاد Migration مربوط به این جدول میتوانیم از دستور زیر استفاده کنیم:
php artisan notifications:table
سپس Migration را اجرا میکنیم:
php artisan migrate
بعد از اجرای Migration، جدول notifications در دیتابیس ایجاد خواهد شد.
ساختار این جدول برای مدیریت Notificationها طراحی شده و امکان ارتباط اعلان با دریافتکننده را فراهم میکند.
# متد toDatabase
برای ذخیره اطلاعات Notification در Database میتوانیم از متد toDatabase() استفاده کنیم.
مثلاً:
public function toDatabase(object $notifiable): array
{
return [
'title' => 'سفارش جدید',
'message' => 'سفارش شما با موفقیت ثبت شد.',
'order_id' => $this->order->id,
];
}
حالا میتوانیم در via() بنویسیم:
public function via(object $notifiable): array
{
return ['database'];
}
در نتیجه Notification به جای ارسال ایمیل، در دیتابیس ذخیره میشود.
# استفاده همزمان از Mail و Database
یکی از کاربردیترین حالتها این است که اعلان را هم به صورت ایمیل ارسال کنیم و هم داخل پنل کاربر ذخیره کنیم.
کافی است:
public function via(object $notifiable): array
{
return ['mail', 'database'];
}
و متدهای مربوطه را تعریف کنیم:
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('ثبت سفارش')
->line('سفارش شما با موفقیت ثبت شد.');
}
و:
public function toDatabase(object $notifiable): array
{
return [
'title' => 'ثبت سفارش',
'message' => 'سفارش شما با موفقیت ثبت شد.',
'order_id' => $this->order->id,
];
}
در این حالت یک Notification میتواند چند خروجی مختلف داشته باشد.
# متد toArray در Notification
در برخی سناریوها به جای toDatabase() میتوان از toArray() برای داده Notification استفاده کرد.
مثلاً:
public function toArray(object $notifiable): array
{
return [
'title' => 'ثبت سفارش',
'order_id' => $this->order->id,
];
}
ساختار داده را بهتر است ساده و مشخص نگه داریم.
به عنوان مثال بهتر است اطلاعات حساس مانند:
- رمز عبور
- Tokenهای خصوصی
- اطلاعات پرداخت حساس
- کلیدهای API
را داخل Notification ذخیره نکنیم.
# دریافت Notificationهای کاربر
پس از فعالسازی Notifiable میتوانیم Notificationهای کاربر را دریافت کنیم.
برای مثال:
$user->notifications;
این مجموعه شامل Notificationهای کاربر است.
همچنین میتوانیم Notificationهای خواندهنشده را دریافت کنیم:
$user->unreadNotifications;
این قابلیت برای ساخت Notification Center در پنل کاربری بسیار کاربردی است.
# نمایش Notificationهای خواندهنشده
فرض کنید در Blade میخواهیم تعداد اعلانهای خواندهنشده را نمایش دهیم.
میتوانیم بنویسیم:
{{ $user->unreadNotifications->count() }}
مثلاً در پنل:
🔔 اعلانها 5
عدد ۵ نشان میدهد که کاربر پنج اعلان خواندهنشده دارد.
برای تعداد زیاد Notification بهتر است به جای دریافت همه رکوردها، از Query مناسب استفاده کنیم تا اطلاعات غیرضروری از دیتابیس دریافت نشود.
# علامتگذاری Notification به عنوان خواندهشده
وقتی کاربر Notification را مشاهده میکند، میتوانیم آن را به عنوان خواندهشده علامتگذاری کنیم.
مثلاً:
$notification->markAsRead();
برای مثال:
$notification = $user->unreadNotifications()->first();
if ($notification) {
$notification->markAsRead();
}
# علامتگذاری همه Notificationها به عنوان خواندهشده
اگر بخواهیم تمام اعلانهای خواندهنشده کاربر را خواندهشده کنیم، میتوانیم از:
$user->unreadNotifications->markAsRead();
استفاده کنیم.
این قابلیت برای دکمهای مانند:
همه را خواندم
بسیار مناسب است.
# Notificationهای خواندهشده
برای دریافت Notificationهای خواندهشده میتوانیم از:
$user->readNotifications;
استفاده کنیم.
در نتیجه سیستم Notification معمولاً سه وضعیت مهم دارد:
All Notifications
│
├── Read
│
└── Unread
# ساخت Notification Center در پنل کاربری
یکی از کاربردهای مهم Database Notification، ساخت مرکز اعلان در پنل کاربری است.
برای مثال در Header سایت میتوانیم یک آیکون زنگ قرار دهیم:
┌──────────────────────────┐
│ 🔔 اعلانها 3 │
├──────────────────────────┤
│ سفارش شما ارسال شد │
│ پرداخت با موفقیت انجام شد│
│ تیکت شما پاسخ داده شد │
└──────────────────────────┘
در Controller میتوانیم Notificationها را دریافت کنیم:
public function notifications()
{
$notifications = auth()->user()
->notifications()
->latest()
->paginate(20);
return view('notifications.index', compact('notifications'));
}
و سپس در Blade:
@foreach ($notifications as $notification)
<div>
<strong>
{{ $notification->data['title'] ?? 'اعلان' }}
</strong>
<p>
{{ $notification->data['message'] ?? '' }}
</p>
</div>
@endforeach
ساختار واقعی UI را میتوان با توجه به طراحی پنل، Tailwind CSS یا هر رابط کاربری دیگری توسعه داد.
# ایجاد Notification شرطی
گاهی لازم است Notification بر اساس شرایط مختلف از کانالهای متفاوتی استفاده کند.
مثلاً اگر کاربر ایمیل داشته باشد، ایمیل ارسال شود:
public function via(object $notifiable): array
{
$channels = ['database'];
if (!empty($notifiable->email)) {
$channels[] = 'mail';
}
return $channels;
}
در این حالت Database Notification همیشه ذخیره میشود، اما Mail فقط زمانی ارسال میشود که کاربر ایمیل داشته باشد.
این روش برای پروژههای واقعی بسیار کاربردی است.
# Notification برای تغییر وضعیت سفارش
حالا یک مثال کاربردیتر ایجاد کنیم.
فرض کنید وضعیت سفارش از:
pending
به:
shipped
تغییر کرده است.
میتوانیم Notification زیر را ایجاد کنیم:
php artisan make:notification OrderShipped
سپس:
class OrderShipped extends Notification
{
use Queueable;
public function __construct(
public Order $order
) {
}
public function via(object $notifiable): array
{
return ['database', 'mail'];
}
public function toDatabase(object $notifiable): array
{
return [
'title' => 'سفارش ارسال شد',
'message' => 'سفارش شما ارسال شده است.',
'order_id' => $this->order->id,
];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('سفارش شما ارسال شد')
->greeting('سلام ' . $notifiable->name)
->line('سفارش شما با موفقیت ارسال شد.')
->line('شماره سفارش: ' . $this->order->id)
->action(
'مشاهده سفارش',
url('/orders/' . $this->order->id)
);
}
}
سپس:
$user->notify(new OrderShipped($order));
به این ترتیب یک عملیات ساده میتواند هم Notification دیتابیسی ایجاد کند و هم ایمیل ارسال کند.
# Notification و Queue
اگر تعداد کاربران زیاد باشد یا ارسال Notification شامل عملیات زمانبر باشد، بهتر است Notification را وارد Queue کنیم.
در پروژههای واقعی، نباید کاری کنیم که کاربر مجبور شود برای ارسال ایمیل یا Notification زمان زیادی منتظر بماند.
Notification میتواند با Queue کار کند.
برای این کار میتوانیم از ShouldQueue استفاده کنیم:
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Notification implements ShouldQueue
{
use Queueable;
// ...
}
در این حالت Laravel میتواند Notification را به Queue منتقل کند.
ساختار کلی به شکل زیر خواهد بود:
User Action
│
▼
Create Order
│
▼
Send Notification
│
▼
Queue
│
▼
Queue Worker
│
├── Mail
└── Database
این معماری برای پروژههایی که Notificationهای زیادی دارند اهمیت زیادی دارد.
موضوع Queue و نحوه اجرای Worker در مقالات بعدی این کلاستر بهصورت جداگانه بررسی خواهد شد.
# چه زمانی Notification را Queue کنیم؟
Queue کردن Notification مخصوصاً در شرایط زیر مفید است:
- تعداد کاربران زیاد است.
- ارسال ایمیل زمانبر است.
- Notification چند کانال دارد.
- سرویس خارجی درگیر است.
- تعداد اعلانها زیاد است.
- سرعت Response برای کاربر اهمیت دارد.
برای یک پروژه کوچک و ساده ممکن است Queue در ابتدا ضروری نباشد؛ اما بهتر است معماری برنامه از ابتدا به شکلی طراحی شود که در صورت رشد پروژه بتوان Notificationها را به Queue منتقل کرد.
# ساخت Notification برای ادمین
Notification فقط برای کاربران عادی نیست.
میتوانیم برای مدیر سیستم نیز Notification ایجاد کنیم.
مثلاً زمانی که یک سفارش جدید ثبت شد:
$admins = User::where('is_admin', true)->get();
Notification::send(
$admins,
new NewOrderNotification($order)
);
در این حالت تمام مدیران مشخصشده اعلان دریافت میکنند.
این قابلیت برای ساخت پنلهای مدیریتی بسیار کاربردی است.
# Notification برای تیکت پشتیبانی
فرض کنید سیستم Ticketing داریم.
وقتی پشتیبان به تیکت کاربر پاسخ میدهد:
Ticket #125
│
▼
Support Reply
│
▼
TicketReplyNotification
│
├── Database
└── Mail
Notification میتواند اطلاعات زیر را ذخیره کند:
public function toDatabase(object $notifiable): array
{
return [
'title' => 'پاسخ جدید به تیکت',
'message' => 'پشتیبان به تیکت شما پاسخ داده است.',
'ticket_id' => $this->ticket->id,
];
}
کاربر با کلیک روی اعلان میتواند مستقیماً وارد تیکت شود.
# طراحی ساختار مناسب برای داده Notification
بهتر است اطلاعات Database Notification را از ابتدا استاندارد طراحی کنیم.
مثلاً:
return [
'title' => 'سفارش ارسال شد',
'message' => 'سفارش شما ارسال شده است.',
'type' => 'order_shipped',
'order_id' => $this->order->id,
'url' => url('/orders/' . $this->order->id),
];
در این حالت Frontend میتواند بر اساس type رفتار متفاوتی داشته باشد.
برای مثال:
order_created
order_paid
order_shipped
ticket_replied
wallet_charged
password_changed
داشتن یک ساختار مشخص برای Notificationها در پروژههای بزرگ باعث میشود توسعه Notification Center بسیار سادهتر شود.
# Notification، Event و Job چه تفاوتی دارند؟
این سه مفهوم در Laravel ممکن است در ابتدا شبیه به یکدیگر به نظر برسند، اما وظایف متفاوتی دارند.
| مفهوم | وظیفه |
|---|---|
| Event | اعلام اینکه اتفاقی رخ داده است |
| Notification | اطلاعرسانی به یک دریافتکننده |
| Job | اجرای یک کار |
| Queue | اجرای غیرهمزمان کارها |
برای مثال:
Order Created
│
▼
Event
│
▼
Listener
│
▼
Notification
│
▼
Queue
│
├── Email
└── Database
این معماری به شما اجازه میدهد سیستمهای بزرگتر را تمیزتر طراحی کنید.
مقاله Event و Listener در Laravel که در ادامه همین کلاستر قرار دارد، این موضوع را دقیقتر بررسی خواهد کرد.
# Notification در Laravel چه زمانی انتخاب مناسبی نیست؟
Notification ابزار بسیار قدرتمندی است، اما نباید برای هر کاری از آن استفاده کنیم.
اگر فقط میخواهید یک ایمیل پیچیده و اختصاصی ارسال کنید، Mailable ممکن است انتخاب مناسبتری باشد.
اگر میخواهید یک عملیات سنگین اجرا کنید، Job انتخاب مناسبتری است.
اگر میخواهید اعلام کنید اتفاقی در سیستم رخ داده است تا چند بخش مختلف به آن واکنش نشان دهند، Event انتخاب مناسبتری است.
بهتر است هر مفهوم مسئولیت خودش را داشته باشد.
# اشتباهات رایج در استفاده از Notification
۱. قرار دادن اطلاعات حساس
اطلاعات حساس را داخل Database Notification ذخیره نکنید.
مثلاً:
'password' => $user->password
کاملاً اشتباه است.
Notification باید فقط اطلاعات مورد نیاز برای نمایش یا انجام عملیات مرتبط را نگه دارد.
۲. قرار دادن منطق زیاد داخل Notification
Notification نباید به محلی برای قرار دادن تمام منطق کسبوکار تبدیل شود.
مثلاً بهتر است محاسبات پیچیده، تغییر وضعیت سفارش و عملیات اصلی سیستم قبل از Notification انجام شوند.
Notification بیشتر مسئول اطلاعرسانی است.
۳. ارسال Notificationهای سنگین بدون Queue
اگر Notification باعث ارسال چند درخواست خارجی یا ایمیلهای زیاد میشود، بهتر است از Queue استفاده کنید.
۴. دریافت تمام Notificationها بدون Pagination
در پروژهای که کاربر هزاران Notification دارد، این کد میتواند مشکلساز شود:
$user->notifications;
اگر فقط ۲۰ اعلان آخر را میخواهید، بهتر است از Pagination استفاده کنید:
$user->notifications()
->latest()
->paginate(20);
۵. نداشتن ساختار استاندارد برای Notification
اگر هر Notification ساختار داده متفاوتی داشته باشد، ساخت Notification Center سختتر میشود.
بهتر است از ابتدا فیلدهایی مانند:
title
message
type
url
related_id
را با یک الگوی مشخص مدیریت کنید.
# یک نمونه کامل Notification
در نهایت یک نمونه نسبتاً کامل از Notification تغییر وضعیت سفارش را ببینیم:
<?php
namespace App\Notifications;
use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class OrderStatusChanged extends Notification implements ShouldQueue
{
use Queueable;
public function __construct(
public Order $order,
public string $status
) {
}
public function via(object $notifiable): array
{
return ['database', 'mail'];
}
public function toDatabase(object $notifiable): array
{
return [
'type' => 'order_status_changed',
'title' => 'تغییر وضعیت سفارش',
'message' => 'وضعیت سفارش شما تغییر کرده است.',
'order_id' => $this->order->id,
'status' => $this->status,
'url' => url('/orders/' . $this->order->id),
];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('تغییر وضعیت سفارش')
->greeting('سلام ' . $notifiable->name)
->line('وضعیت سفارش شما تغییر کرده است.')
->line('شماره سفارش: ' . $this->order->id)
->line('وضعیت جدید: ' . $this->status)
->action(
'مشاهده سفارش',
url('/orders/' . $this->order->id)
);
}
}
و ارسال آن:
$user->notify(
new OrderStatusChanged(
$order,
'shipped'
)
);
در این مثال، یک Notification داریم که:
- در Database ذخیره میشود.
- ایمیل ارسال میکند.
- اطلاعات سفارش را همراه خود دارد.
- URL مشاهده سفارش دارد.
- قابلیت Queue شدن دارد.
- نوع Notification را مشخص میکند.
این الگو میتواند پایه یک سیستم Notification حرفهای در پروژههای واقعی باشد.
# بهترین روش طراحی سیستم Notification در Laravel
اگر پروژه شما قرار است بزرگ شود، بهتر است Notificationها را از ابتدا با یک ساختار مشخص ایجاد کنید.
مثلاً:
app/
└── Notifications/
├── OrderCreated.php
├── OrderPaid.php
├── OrderShipped.php
├── OrderCancelled.php
├── TicketReplied.php
└── WalletCharged.php
همچنین بهتر است:
- Notificationها نام مشخص داشته باشند.
- اطلاعات حساس ذخیره نشود.
- Notificationهای سنگین Queue شوند.
- دادههای Database ساختار مشخصی داشته باشند.
- Notification Center از Pagination استفاده کند.
- وضعیت Read و Unread مدیریت شود.
- منطق کسبوکار از Notification جدا بماند.
# جمعبندی
Notification در Laravel یکی از امکانات مهم برای ساخت سیستمهای اطلاعرسانی حرفهای است.
با Notification میتوانیم یک اعلان را از طریق کانالهای مختلف ارسال کنیم و برای مثال همزمان:
- ایمیل ارسال کنیم.
- اعلان را در دیتابیس ذخیره کنیم.
- آن را در پنل کاربر نمایش دهیم.
- وضعیت خواندهشدن آن را مدیریت کنیم.
- Notification را وارد Queue کنیم.
برای ساخت Notification از Artisan استفاده میکنیم:
php artisan make:notification OrderCreated
کانالهای مورد استفاده را در via() مشخص میکنیم:
public function via(object $notifiable): array
{
return ['database', 'mail'];
}
برای Database Notification نیز از:
php artisan notifications:table
و سپس:
php artisan migrate
استفاده میکنیم.
در نهایت میتوانیم Notification را به شکل ساده برای کاربر ارسال کنیم:
$user->notify(new OrderCreated($order));
یا برای مجموعهای از کاربران:
Notification::send(
$users,
new OrderCreated($order)
);
اگر Notificationها به درستی طراحی شوند، میتوانند پایه یک Notification Center کامل برای فروشگاه اینترنتی، پنل مدیریت، سیستم تیکت، SaaS، CMS یا هر نرمافزار Laravel دیگری باشند.
# سوالات متداول
Notification در Laravel چیست؟
Notification سیستم داخلی Laravel برای اطلاعرسانی به کاربران از طریق کانالهایی مانند Mail و Database است.
تفاوت Notification و Mail در Laravel چیست؟
Mail بیشتر برای ارسال ایمیل طراحی شده است، در حالی که Notification میتواند یک اعلان را از طریق چند کانال مختلف ارسال یا ذخیره کند.
چگونه Notification در Laravel بسازیم؟
با Artisan:
php artisan make:notification OrderCreated
چگونه Notification را برای کاربر ارسال کنیم؟
با استفاده از:
$user->notify(new OrderCreated());
چگونه Notification را در دیتابیس ذخیره کنیم؟
ابتدا جدول Notification را ایجاد کنید:
php artisan notifications:table
سپس:
php artisan migrate
و در Notification کانال database را فعال کنید.
چگونه اعلانهای خواندهنشده را دریافت کنیم؟
از:
$user->unreadNotifications
استفاده کنید.
چگونه یک Notification را خواندهشده کنیم؟
با:
$notification->markAsRead();
آیا Notification در Laravel قابلیت Queue دارد؟
بله. Notification میتواند با پیادهسازی ShouldQueue به Queue منتقل شود.
آیا میتوان یک Notification را همزمان با Mail و Database ارسال کرد؟
بله. کافی است در via() بنویسید:
return ['mail', 'database'];





