برنامه نویسی ۱۶۲۷ بازدید

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

مبانی اعلان‌ها

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

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

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

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

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

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

سیستم اعلان

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

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

در این بخش، فایل‌های ضروری که برای پیاده‌سازی کاربرد عملی مورد نظر ما لازم هستند را معرفی می‌کنیم. در آغاز کار یک مدل Message ایجاد می‌کنیم که پیام‌های ارسالی از سوی کاربران به همدیگر را نگهداری می‌کند.

$php artisan make:model Message –migration

همچنین باید چند فیلد دیگر مانند to ،from و message را به جدول messages اضافه کنیم. بدین ترتیب فایل migration را پیش از اجرای دستور migrate تغییر می‌دهیم.

<?php
 
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreateMessagesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('messages', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('from', FALSE, TRUE);
            $table->integer('to', FALSE, TRUE);
            $table->text('message');
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('messages');
    }
}

اینک دستور migrate را که جدول پیام‌ها را در پایگاه داده ایجاد می‌کند اجرا می‌کنیم.

$php artisan migrate

دستور فوق یک جدول به نام messages در پایگاه داده ایجاد می‌کند.

ضمناً باید مطمئن شوید که سیستم احراز هویت پیش فرض لاراول را در ابتدا فعال کرده‌اید و بدین ترتیب ویژگی‌هایی مانند ثبت نام و ورود از قبل کار می‌کنند. اگر در مورد شیوه انجام این کار مطمئن نیستید می‌توانید به این بخش از مستندات لاراول (+) مراجع کنید تا دید سریعی در این خصوص پیدا کنید.

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

$php artisan make:notification NewMessage

این دستور کلاس زیر را ایجاد می‌کند:

app/Notifications/NewMessage.php

بدین ترتیب محتوای آن فایل را با محتوای زیر عوض می‌کنیم:

<?php
// app/Notifications/NewMessage.php
namespace App\Notifications;
 
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use App\User;
 
class NewMessage extends Notification
{
    use Queueable;
    public $fromUser;
 
    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->fromUser = $user;
    }
 
    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail'];
    }
 
    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        $subject = sprintf('%s: You\'ve got a new message from %s!', config('app.name'), $this->fromUser->name);
        $greeting = sprintf('Hello %s!', $notifiable->name);
 
        return (new MailMessage)
                    ->subject($subject)
                    ->greeting($greeting)
                    ->salutation('Yours Faithfully')
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!');
    }
 
    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

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

سپس متد toMail را داریم که امکان پیکربندی پارامترهای مختلف ایمیل را در اختیار ما قرار می‌دهد. در واقع، متد toMail باید وهله‌ای از کلاس زیر را ارائه کند:

\Illuminate\Notifications\Messages\MailMessage

این کلاس متدهای مفیدی ارائه می‌کند که امکان پیکربندی پارامترهای ایمیل را فراهم ساخته است.

در میان متدهای مختلف، متد line امکان افزودن یک خط منفرد را در یک پیام ارائه می‌کند. از سوی دیگر متد action امکان افزودن یک دکمه Call-to-Action را در پیام در اختیار ما قرار می‌دهد.

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

در نهایت باید مطمئن شوید که متدهای مورد نیاز را بر اساس نوع کانال پیکربندی شده از طریق متد via پیاده‌سازی کرده‌اید. برای نمونه اگر از کانال پایگاه داده استفاده می‌کند و اعلان‌ها را در یک پایگاه داده ذخیره خواهید کرد، نیازی به پیکربندی متد toMail ندارید و در عوض باید متد toArray را پیاده‌سازی کنید که به قالب‌بندی داده‌هایی که باید در پایگاه داده ذخیره شوند می‌پردازد.

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

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

ابتدا یک فایل در مسیر زیر ایجاد می‌کنیم:

app/Http/Controllers/NotificationController.php

محتوای این فایل به صورت زیر است:

<?php
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use App\Message;
use App\User;
use App\Notifications\NewMessage;
use Illuminate\Support\Facades\Notification;
 
class NotificationController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
 
    public function index()
    {
        // user 2 sends a message to user 1
        $message = new Message;
        $message->setAttribute('from', 2);
        $message->setAttribute('to', 1);
        $message->setAttribute('message', 'Demo message from user 2 to user 1.');
        $message->save();
         
        $fromUser = User::find(2);
        $toUser = User::find(1);
         
        // send notification using the "user" model, when the user receives new message
        $toUser->notify(new NewMessage($fromUser));
         
        // send notification using the "Notification" facade
        Notification::send($toUser, new NewMessage($fromUser));
    }
}

البته باید یک مسیر مرتبط در فایل routes/web.php اضافه کنید:

Route::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 است.

$toUser->notify(new NewMessage($fromUser));

ممکن است متوجه شده باشید که یک شیء fromUser$ را نیز به عنوان آرگومان نخست متد __construct ارسال می‌کنیم، چون می‌خواهیم نام کاربری from را نیز در پیام بگنجانیم.

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

Notification::send($toUser, new NewMessage($fromUser));

همان طور که مشاهده می‌کنید، ما از متد send برای ارسال facade به نام Notification به کاربر استفاده کرده‌ایم.

در ادامه URL به صورت http://your-laravel-site-domain/notify/index را در مرورگر خود باز کنید. اگر هنوز وارد سایت نشده باشید، به صفحه لاگین ریدایرکت می‌شوید. زمانی که وارد شدید یک اعلان ایمیل در آدرس ایمیل متصل به کاربر 1 دریافت خواهید کرد.

ممکن است کنجکاو باشید که سیستم اعلان چگونه آدرس to را تشخیص داده است در حالی که شما هنوز آن را پیکربندی نکرده‌اید. در این حالت سیستم اعلان سعی می‌کند مشخصه email را در شیء notifiable پیدا کند. کلاس شیء App/User نیز از قبل این مشخصه را دارد، چون از سیستم اعلان پیش فرض لاراول استفاده می‌کنیم.

با این وجود، اگر می‌خواهید این رفتار را تغییر دهید و از مشخصه متفاوتی به جز email استفاده کنید کافی است متد زیر را در کلاس notification خود تعریف کنید:

public function routeNotificationForMail()
{
    return $this->email_address;
}

اکنون سیستم اعلان به جای مشخصه email برای واکشی آدرس to به دنبال مشخصه email_address می‌گردد. بدین ترتیب با شیوه استفاده از سیستم اعلان در لاراول آشنا شدیم.

سخن پایانی

مطلبی که با عنوان اعلان‌ها در لاراول ملاحظه کردید، به بررسی یکی از ویژگی‌های بسیار مفید، اما در عین حال مغفول لاراول پرداخته است. پس از یک مقدمه کوتاه یک مثال عملی را پیاده‌سازی کردیم که شیوه ارسال اعلان از طریق کانال ایمیل را توضیح می‌دهد. در واقع این وضعیت در حالتی که پیام‌های کوتاهی در مورد تغییرات در اپلیکیشن ارسال می‌کنیم کاملاً کارآمد است.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۴ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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