آموزش لاراول - کار با Notifications

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


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

اگر وارد مدل User که به طور پیش فرض در لاراول وجود داره بشه یک خاصیت به نام Notifiable وجود داره که اگر اون رو هم نگاه کنید دوتا خاصیت دیگه در اونجا هست : 

Image for post
Image for post

خاصیت HasDatabaseNotifications برای کار با نوتیفیکیشن‌هایی هست که درون سیستمی هستند و در جدول ذخیره میشن! مانند همین نوتیفیکشن‌های پرسپت که جلوتر در مورد ابزارهایی که در اختیار ما قرار میده صحبت خواهیم کرد و دیگری RoutesNotifications که قابلیت‌ ارسال نوتیفیکشن بر ر.ی مدل کاربر رو برای ما فراهم می‌کنه:

$user->notify(new SampleNotification());

به همین راحتی شما می‌تونید بر اساس کانالی که تعریف کردید برای کاربر پیغامی رو ارسال کنید:

اجازه بدید یک مدل Notification ایجاد کنیم و آنرا بررسی کنیم:

php artisan make:notification InvoicePaid

پس از اجرای دستور فوق یک کلاس جدید در دایرکتوری app/Notifications ایجاد خواهد شد:

Image for post
Image for post

همانطور که مشاهده می‌کنید در این کلاس یک سازنده وجود داره که شما می‌تونید مقادیرتون رو از طریق اون وارد کنید. در اینجا یک متد مهم بنام via برای تعریف کانال ارسال وجود داره که براساس اون توابع بعدی باید تعریف بشن! به این صورت که اگر مانند تصویر فوق خروجی این تابع شامل mail بود تابع toMail فراخوانی میشه و پیغام تعریف شده در اینجا به کاربر ارسال میشه. اگر خروجی شامل database هم می‌بود باید تابع toArray مواردی که می‌خواهیم به کاربر از طریق درون سیستمی دیتابیس ارسال بشه تعریف کنیم. برای کانال‌های دیگه هم باید تابع مربوطه رو تعریف کنید می‌توانید لیست کامل این کانال‌ها را در زیر مشاهده کنید:

پیش از شروع باید mailtrap رو تنظیم کرده باشید که در مق اله زیر در این مورد و نحوه تنظیم ایمیل‌ هم نکاتی رو گفتم که می‌تونید درآنجا مطالعه کنید:

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

    $user = \App\Models\User::first();
    $user->notify(new \App\Notifications\InvoicePaid());
Image for post
Image for post

شما همچنین می‌توانید با کمک دستور زیر ایمیل رو مناسب با نیاز ویرایش کنید:

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

برای ارسال ایمیل دستورات دیگری هم هست که می‌توانید در اینجا آنها رو مشاهده کنید.

اما برای ارسال نوتیفیکیشن از طریق دیتابیس ابتدا باید دستور زیر را اجرا کنید تا فایل‌ مربوط به جدول ایجاد بشه!

 php artisan notification:table

پس از دستور فوق لازم هست که یکبار migrate رو انجام بدیم تا جدول مورد نظر هم ایجاد بشه. حالا به متد ToArray برمی‌گردیم و مقادیری که نیاز داریم رو تعریف می‌کنیم. من در اینجا برای تست یک آرایه بصورت زیر تعریف کردم که البته شما می‌تونید هر دیتایی که لازم دارید رو از طریق سازنده به کلاس وارد کنید:

Image for post
Image for post

در اینجا توجه کنید که notifiable در اینجا همون کاربر هست و شما از طریق این متغیر می‌تونید به مدل کاربر دسترسی داشته باشید. برای اینکه ارسال از طریق دیتابیس انجام بشه همانطور که گفتیم کافیه به تابع via برگردید مقدار database رو هم به آرایه اضافه کنید. مشاهده خواهید کرد که اینبار با ارسال نوتیفیکیشن در جدول notifications یک رکورد جدید ایجاد خواهد شد.

Image for post
Image for post

اگر به رکورد دقت مقادیری که وارد کردیم در ستون data بصورت json ذخیره شدند ضمنا کاربر هم بصورت polimorph در ستون notifiable ذخیره شده. در اینجا می‌توان ستون read_at رو هم مشاهده کرد که در واقع از آن می‌توان برای ویژگی اعلان‌های جدید که در سایت‌های دیگه هم مشاهده کردید، استفاده میشه. برای گرفتن اعلان‌های یک کاربر هم توابعی وجود داره (که در خاصیت HasDatabaseNotifications قابل مشاهدست) برای مثال اگر بخواهیم تمام نوتیفیکیشن‌های یک کاربر رو بگیریم از دستور زیر استفاده می‌کنیم:

$user->notifications

برای گرفتن تمام نوتیفیکیشن‌های خوانده شده یک کاربر از دستور زیر استفاده می‌کنیم:

$user->readNotifications

و برای گرفتن نوتیفیکیشن‌های خوانده شده دستور زیر رو داریم:

$user->unreadNotifications

در نهایت هم برای اینکه یک notification رو بعنوان یک نوتیفیکیشن‌ خوانده شده ذخیره کنیم از متد markAsRead استفاده کنید:

$user->notifications->first()->markAsRead()

کد مربوط به این آموزش هم در گیت‌هاب زیر موجود هست: