سیستم اعلان (Notification System) در لاراول – راهنمای کاربردی


در این مقاله قصد داریم به بررسی سیستم اعلان در فریمورک وب لاراول بپردازیم. سیستم اعلان در لاراول امکان ارسال اعلانها به کاربران را روی کانالهای مختلف فراهم ساخته است. در این مطلب به بررسی روش امکان ارسال اعلان از طریق کانال ایمیل میپردازیم.
مبانی اعلانها
در زمان توسعه اپلیکیشن در اغلب موارد لازم است که در مورد تغییر وضعیتهای مختلف به کاربران اطلاعرسانی کنید. ارسال اعلان ایمیلی در مواردی که چیزی تغییر یافته است، روش خوبی محسوب میشود. همچنین ارسال پیامک در مورد فعالیت لاگین کردن به منظور رعایت موارد امنیتی گزینه مناسبی است. ما به طور خاص در مورد پیامهایی صحبت میکنیم که کوتاه هستند و در مورد تغییرات صورت گرفته در حساب کاربری اطلاعرسانی میکنند.
لاراول یک ویژگی داخلی دارد که به ما کمک میکند فرایند شبیه به اعلانها را داشته باشیم. در واقع، با استفاده از این سازوکار درونی میتوانیم پیامهای اعلان را به روشی جالب و سرگرمکننده به کاربران ارسال کنیم.
زیبایی این رویکرد این است که امکان انتخاب از میان کانالهای مختلف ارسال اعلان را در اختیار ما قرار میدهد. در ادامه مرور سریعی در مورد کانالهای مختلف اعلان در لاراول خواهیم داشت.
- ایمیل: اعلانها به شکل ایمیل به کاربران ارسال میشوند.
- پیامک: همان طور که از نام آن مشخص است کاربران اعلانها را در قالب پیامکهایی روی گوشی خود دریافت میکنند.
- Slack: در این حالت، اعلانها روی کانالهای اسلک ارسال میشوند.
- پایگاه داده: این گزینه امکان ذخیرهسازی اعلانها در پایگاه داده را فراهم میسازد و به این ترتیب میتوانید یک رابط کاربری سفارشی برای نمایش آنها ایجاد کنید.
از میان کانالهای مختلفی که برای ارسال اعلان وجود دارند، ما قصد داریم در مثالی که در این نوشته ارائه میکنیم از ایمیل استفاده کنیم.
در واقع مثالی که در این مطلب ارائه خواهد شد یک کاربرد عملی کاملاً ساده است که به کاربران اپلیکیشن ما اجازه میدهد که پیامهایی را به هر کاربر ارسال کنند. زمانی که کاربران یک پیام جدید را در اینباکس خود دریافت کنند، با ارسال ایمیلی به آنها، رویدادی که رخ داده است را به اطلاع آنها خواهیم رساند. این کار را با استفاده از ویژگی اعلان در لاراول انجام میدهیم.
ایجاد یک کلاس اعلان سفارشی
همان طور که قبلاً صحبت کردیم، قصد داریم یک اپلیکیشن راهاندازی کنیم که به کاربران امکان ارسال پیام به همدیگر را میدهد. از سوی دیگر هنگامی که کاربران پیام جدیدی را از طریق کاربران دیگر و به وسیله ایمیل دریافت کنند این مسئله به آنها اعلام میشود.
در این بخش، فایلهای ضروری که برای پیادهسازی کاربرد عملی مورد نظر ما لازم هستند را معرفی میکنیم. در آغاز کار یک مدل Message ایجاد میکنیم که پیامهای ارسالی از سوی کاربران به همدیگر را نگهداری میکند.
1$php artisan make:model Message –migration
همچنین باید چند فیلد دیگر مانند to ،from و message را به جدول messages اضافه کنیم. بدین ترتیب فایل migration را پیش از اجرای دستور migrate تغییر میدهیم.
1<?php
2
3use Illuminate\Support\Facades\Schema;
4use Illuminate\Database\Schema\Blueprint;
5use Illuminate\Database\Migrations\Migration;
6
7class CreateMessagesTable extends Migration
8{
9 /**
10 * Run the migrations.
11 *
12 * @return void
13 */
14 public function up()
15 {
16 Schema::create('messages', function (Blueprint $table) {
17 $table->increments('id');
18 $table->integer('from', FALSE, TRUE);
19 $table->integer('to', FALSE, TRUE);
20 $table->text('message');
21 $table->timestamps();
22 });
23 }
24
25 /**
26 * Reverse the migrations.
27 *
28 * @return void
29 */
30 public function down()
31 {
32 Schema::dropIfExists('messages');
33 }
34}
اینک دستور migrate را که جدول پیامها را در پایگاه داده ایجاد میکند اجرا میکنیم.
1$php artisan migrate
دستور فوق یک جدول به نام messages در پایگاه داده ایجاد میکند.
ضمناً باید مطمئن شوید که سیستم احراز هویت پیش فرض لاراول را در ابتدا فعال کردهاید و بدین ترتیب ویژگیهایی مانند ثبت نام و ورود از قبل کار میکنند. اگر در مورد شیوه انجام این کار مطمئن نیستید میتوانید به این بخش از مستندات لاراول (+) مراجع کنید تا دید سریعی در این خصوص پیدا کنید.
از آنجا که هر اعلان در لاراول از سوی کلاس مجزایی نمایش مییابد، باید یک کلاس اعلان سفارشی ایجاد کنیم که جهت اطلاعرسانی به کاربران مورد استفاده قرار میگیرد. در ادامه از دستور artisan زیر برای ایجاد یک کلاس اعلان سفارشی به نام NewMessage استفاده میکنیم.
1$php artisan make:notification NewMessage
این دستور کلاس زیر را ایجاد میکند:
app/Notifications/NewMessage.php
بدین ترتیب محتوای آن فایل را با محتوای زیر عوض میکنیم:
1<?php
2// app/Notifications/NewMessage.php
3namespace App\Notifications;
4
5use Illuminate\Bus\Queueable;
6use Illuminate\Notifications\Notification;
7use Illuminate\Contracts\Queue\ShouldQueue;
8use Illuminate\Notifications\Messages\MailMessage;
9use App\User;
10
11class NewMessage extends Notification
12{
13 use Queueable;
14 public $fromUser;
15
16 /**
17 * Create a new notification instance.
18 *
19 * @return void
20 */
21 public function __construct(User $user)
22 {
23 $this->fromUser = $user;
24 }
25
26 /**
27 * Get the notification's delivery channels.
28 *
29 * @param mixed $notifiable
30 * @return array
31 */
32 public function via($notifiable)
33 {
34 return ['mail'];
35 }
36
37 /**
38 * Get the mail representation of the notification.
39 *
40 * @param mixed $notifiable
41 * @return \Illuminate\Notifications\Messages\MailMessage
42 */
43 public function toMail($notifiable)
44 {
45 $subject = sprintf('%s: You\'ve got a new message from %s!', config('app.name'), $this->fromUser->name);
46 $greeting = sprintf('Hello %s!', $notifiable->name);
47
48 return (new MailMessage)
49 ->subject($subject)
50 ->greeting($greeting)
51 ->salutation('Yours Faithfully')
52 ->line('The introduction to the notification.')
53 ->action('Notification Action', url('/'))
54 ->line('Thank you for using our application!');
55 }
56
57 /**
58 * Get the array representation of the notification.
59 *
60 * @param mixed $notifiable
61 * @return array
62 */
63 public function toArray($notifiable)
64 {
65 return [
66 //
67 ];
68 }
69}
از آنجا که قصد داریم از کانال ایمیل برای ارسال اعلانها به کاربران دیگر استفاده کنیم، متد via نیز بر همین اساس پیکربندی شده است. از این رو این متد به ما امکان میدهد که نوع کانال یک اعلان را پیکربندی کنیم.
سپس متد toMail را داریم که امکان پیکربندی پارامترهای مختلف ایمیل را در اختیار ما قرار میدهد. در واقع، متد toMail باید وهلهای از کلاس زیر را ارائه کند:
\Illuminate\Notifications\Messages\MailMessage
این کلاس متدهای مفیدی ارائه میکند که امکان پیکربندی پارامترهای ایمیل را فراهم ساخته است.
در میان متدهای مختلف، متد line امکان افزودن یک خط منفرد را در یک پیام ارائه میکند. از سوی دیگر متد action امکان افزودن یک دکمه Call-to-Action را در پیام در اختیار ما قرار میدهد.
به این ترتیب میتوانید یک پیام را که به کاربران ارسال خواهد شد قالببندی کنید. بنابراین شیوه پیکربندی کلاس اعلان در هنگام استفاده از کانال ایمیل برای ارسال اعلانها این گونه است.
در نهایت باید مطمئن شوید که متدهای مورد نیاز را بر اساس نوع کانال پیکربندی شده از طریق متد via پیادهسازی کردهاید. برای نمونه اگر از کانال پایگاه داده استفاده میکند و اعلانها را در یک پایگاه داده ذخیره خواهید کرد، نیازی به پیکربندی متد toMail ندارید و در عوض باید متد toArray را پیادهسازی کنید که به قالببندی دادههایی که باید در پایگاه داده ذخیره شوند میپردازد.
شیوه ارسال اعلان
در بخش قبلی یک کلاس اعلان ایجاد کردیم که امکان ارسال اعلان را در اختیار ما قرار میدهد. در این بخش فایلهایی که شیوه عملی ارسال اعلان با استفاده از کلاس اعلان newMessege را در اختیار ما قرار میدهند مورد بررسی قرار میدهیم.
ابتدا یک فایل در مسیر زیر ایجاد میکنیم:
app/Http/Controllers/NotificationController.php
محتوای این فایل به صورت زیر است:
1<?php
2namespace App\Http\Controllers;
3
4use App\Http\Controllers\Controller;
5use App\Message;
6use App\User;
7use App\Notifications\NewMessage;
8use Illuminate\Support\Facades\Notification;
9
10class NotificationController extends Controller
11{
12 public function __construct()
13 {
14 $this->middleware('auth');
15 }
16
17 public function index()
18 {
19 // user 2 sends a message to user 1
20 $message = new Message;
21 $message->setAttribute('from', 2);
22 $message->setAttribute('to', 1);
23 $message->setAttribute('message', 'Demo message from user 2 to user 1.');
24 $message->save();
25
26 $fromUser = User::find(2);
27 $toUser = User::find(1);
28
29 // send notification using the "user" model, when the user receives new message
30 $toUser->notify(new NewMessage($fromUser));
31
32 // send notification using the "Notification" facade
33 Notification::send($toUser, new NewMessage($fromUser));
34 }
35}
البته باید یک مسیر مرتبط در فایل routes/web.php اضافه کنید:
1Route::get('notify/index', 'NotificationController@index');
دو روش وجود دارد که به لاراول امکان میدهد تا اعلانها را ارسال کند: یکی از آنها از طریق نهاد notifiable و دیگری از طریق Notification facade است.
اگر کلاس مدل نهاد از خصیصه Illuminate\Notifications\Notifiable استفاده کرده باشد میتوانید متد notify را روی مدل فراخوانی کنید. کلاس App\User خصیصه Notifiable را پیادهسازی میکند و از این رو به نهاد Notifiable تبدیل میشود. از سوی دیگر میتوانید از Facade موجود در مسیر Illuminate\Support\Facades\Notification نیز برای ارسال اعلان به کاربران استفاده کنید.
در ادامه متد index کنترلر را مورد بررسی قرار میدهیم.
در مورد مثالی که ما بررسی میکنیم، قصد داریم زمانی که کاربران پیام جدیدی دریافت میکنند به آنها اطلاعرسانی کنیم. بنابراین باید رفتار متد inbox را در وهله نخست تقلید کنیم.
سپس با استفاده از متد notify روی شیء $toUser به کاربر گیرنده در مورد پیام جدید اطلاعرسانی میکنیم چون یک نهاد notifiable است.
1$toUser->notify(new NewMessage($fromUser));
ممکن است متوجه شده باشید که یک شیء fromUser$ را نیز به عنوان آرگومان نخست متد __construct ارسال میکنیم، چون میخواهیم نام کاربری from را نیز در پیام بگنجانیم.
از سوی دیگر اگر بخواهیم آن را با استفاده از Notification شبیهسازی کنیم، این کار با استفاده از قطعه کد زیر بسیار آسان خواهد بود.
1Notification::send($toUser, new NewMessage($fromUser));
همان طور که مشاهده میکنید، ما از متد send برای ارسال facade به نام Notification به کاربر استفاده کردهایم.
در ادامه URL به صورت http://your-laravel-site-domain/notify/index را در مرورگر خود باز کنید. اگر هنوز وارد سایت نشده باشید، به صفحه لاگین ریدایرکت میشوید. زمانی که وارد شدید یک اعلان ایمیل در آدرس ایمیل متصل به کاربر 1 دریافت خواهید کرد.
ممکن است کنجکاو باشید که سیستم اعلان چگونه آدرس to را تشخیص داده است در حالی که شما هنوز آن را پیکربندی نکردهاید. در این حالت سیستم اعلان سعی میکند مشخصه email را در شیء notifiable پیدا کند. کلاس شیء App/User نیز از قبل این مشخصه را دارد، چون از سیستم اعلان پیش فرض لاراول استفاده میکنیم.
با این وجود، اگر میخواهید این رفتار را تغییر دهید و از مشخصه متفاوتی به جز email استفاده کنید کافی است متد زیر را در کلاس notification خود تعریف کنید:
1public function routeNotificationForMail()
2{
3 return $this->email_address;
4}
اکنون سیستم اعلان به جای مشخصه email برای واکشی آدرس to به دنبال مشخصه email_address میگردد. بدین ترتیب با شیوه استفاده از سیستم اعلان در لاراول آشنا شدیم.
سخن پایانی
مطلبی که با عنوان اعلانها در لاراول ملاحظه کردید، به بررسی یکی از ویژگیهای بسیار مفید، اما در عین حال مغفول لاراول پرداخته است. پس از یک مقدمه کوتاه یک مثال عملی را پیادهسازی کردیم که شیوه ارسال اعلان از طریق کانال ایمیل را توضیح میدهد. در واقع این وضعیت در حالتی که پیامهای کوتاهی در مورد تغییرات در اپلیکیشن ارسال میکنیم کاملاً کارآمد است.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی PHP
- آموزش REST API در Laravel (لاراول) با بسته Passport
- طراحی و توسعه پروژههای وب
- زمانبندی وظایف در لاراول (Laravel) — راهنمای مقدماتی
- 12 فریمورک وب که توسعه دهندگان باید در سال 2۰1۸ بیاموزند
==