برچسب: لاراول 5.3

  • ساخت custom notification channel در لاراول

    لاراول برای ارسال نوتیفیکیشن درایور های متنوعی داره که برای کاراتون میتونید ازش استفاده کنید… ولی بعضی وقتا پیش میاد که نیاز دارید چنل خودتون رو داشته باشید، برای این کار باید کانال ارسال خودتون رو بنویسید که خیلی راحته

    مثلا در مسیر app  یک فولدر با عنوان channels  بسازید و توش یه کلاس php با اسم دلخواهتون ایجاد کنید. من اسمشو میذارم SmsChannel .

    <?php
    
    namespace App\Channels;
    
    use Illuminate\Notifications\Notification;
    
    class SmsChannel
    {
        /**
         * Send the given notification.
         *
         * @param  mixed  $notifiable
         * @param  \Illuminate\Notifications\Notification  $notification
         * @return void
         */
        public function send($notifiable, Notification $notification)
        {
            $message = $notification->toSms($notifiable);
            //do your action
        }
    }

    در قسمت do your action عملیاتی که برای ارسال نوتیفیکیشنتون(!) رو که میتونه متنوع باشه رو انجام بدید… مثلا اگه میخواید با استفاده از یه سرویس دهنده خاص اس ام اس ارسال کنید میتونید کلاسهای اون رو ایمپورت کنید و اس ام اس رو ارسال کنید.

    مثلا برای ارسال پیامک بصورت زیر عمل کنید :

    send_sms($message['receptor'], $message['message']);

    که آرایه message  از متد های کلاس های نوتیفیکیشن ها ارسال میشه…

    برای ارسال نوتیفیکیشن در متد via  در کلاس نوتیفیکیشن \App\Channels\SmsChannel::class  رو برگردونید… یه چیزی مثل این :

    /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return [\App\Channels\SmsChannel::class];
        }

    که میتونید از $notifiable  استفاده کنید و ببینید که اس ام اس واسه کاربر ارسال بشه یا نه… مثلا اعتبار کاربریش اجازه ارسال رو میده یا نه.

    و متد زیر رو برای ارسال پیام در کلاس مربوط به نوتیفیکیشن بنویسید :

    public function toSms($notifiable)
        {
            return [
                'receptor' => $notifiable->mobile,
                'message'  =>  'یک ورود ناموفق به حساب شما ثبت شد.'
            ];
        }
  • نوتیفیکیشن های لاراول ۵٫۳

    جدیدا توی چیتاسافت مجبور شدم از لاراول ۵ دل بکنم و سوییچ کنم روی لاراول ۵٫۳.  یکی از امکانات جالبی که تو این ورژن به لاراول اضافه شده notification ها هستند و میخوام یکم در موردشون حرف بزنم. لاراول قبلا ارسال ایمیل رو با سویفت میلر ممکن کرده بود و با درایورهای مختلف میتونستیم ایمیل ارسال کنیم.

    تو نوتیفیکیشن ها اوضاع بهتر هم میشه و میتونیم نوتیفیکیشن رو علاوه بر ایمیل بصورت SMS  و حتی بصورت نوتیفیکیشن slack و تلگرام و… هم بفرستیم که لیستشو میتونید تو سایت  laravel-notification-channels ببینید. برای شروع از کامند آشنای make استفاده میکنیم :

    php artisan make:notification Pay
    

    یه کلاس Pay توی Notificatios ساخنه میشه که از کلاس Notification مشتق شده… یه متد به نام via توش وجود داره بصورت پیشفرض که کانال های ارسال اعلان(نوتیفیکیشن) رو توش مشخص میکنیم. و یک سری متد دیگه که اعلان شما رو پردازش میکنن تا با کانال مورد نظر بتونن نوتیف رو ارسال کنن… مثل توابع toMail و…

    با دو روش میتونید ارسال کنید نوتیف رو :

    1. استفاده از Notifiable Trait
    2. استفاده از فساد Notification

     

    استفاده از Notifiable Trait

    این trait بصورت پیشفرض توی مدل User وجود داره و معمولا برای ارسال نوتیفیکیشن به یک یوزر استفاده میشه… یک متد notify داره که یک ورودی از نوع Notification میگیره. به این صورت مثلا :

    use App\Notifications\Pay;
    
    $user->notify(new Pay($invoice));
    
    استفاده از فساد Notification

    پیشنهاد میشه از این روش استفاده کنید. چون میتونید به چند کاربر و مثلا به یک کالکشن هم اعلان بفرستید خیلی شیک :

    Notification::send($users, new Pay($invoice));

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

  • کار با بیش از یک دیتابیس در لاراول ۵

    بعضی وقتا نیازه که شما با بیش از یک دیتابیس در ارتباط باشید در لاراول ، مثلا ممکنه برای هر وبلاگی که توی سیستم وبلاگ دهی شما ایجاد میشه یک دیتابیس درست کنید(البته فک نکنم تو این مورد ، این کار معقول باشه) اونجا نیاز هست که در اولین قدم توی فایل config/database.php  کانکشن مربوط به این کار رو ایجاد کنید. بصورت پیشفرض ۴ کانکشن در لاراول ۵ تعریف شده که میتونید شما هم کانکشن دیگه ای برای استفاده تعریف کنید.

    تعریف کانکشن برای اتصال به بیش از یک دیتابیس

    'mysql2' => [
                'driver'    => 'mysql',
                'host'      => env('DB_EXT_HOST', 'localhost'),
                'database'  => env('DB_EXT_DATABASE', 'db2'),
                'username'  => env('DB_EXT_USERNAME', 'username'),
                'password'  => env('DB_EXT_PASSWORD', 'password'),
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
                'strict'    => false,
            ],

    توی کد بالا ما کانکشن mysql2  رو تعریف کردیم. دقت داشته باشید که کد بالا باید درون connectios تعریف کنید. همچنین توی ریشه اصلی پروژه و توی فایل .env  هم کانکشن باید مشخص شه… اون فایل رو ادیت کنید و مقادیر دلخواهتون رو اضافه کنید :

    DB_EXT_HOST=localhost
    DB_EXT_DATABASE=db2
    DB_EXT_USERNAME=username
    DB_EXT_PASSWORD=password

    حالا کانکشن های شما آماده هستند و میتونید به روشی که در ادامه میگم از اونها استفاده کنید.

    تغییر کانکشن پیشفرض در لاراول

    برای اینکه در کل پروژه کانکشن پیشفرض رو تغییر بدیم ، در فایل config/database.php  مقدار ‘default’ => ‘mysql’,  رو به ‘default’ => ‘mysql2’,  تغییر میدیم. در این صورت در کل پروژه شما mysql2 بعنوان کانکشن دیفالت استفاده خواهد شد.

    استفاده از یک کانکشن در یک مدل خاص

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

    <?php
    class SomeModel extends Eloquent {
     
        protected $connection = 'mysql2';
     
    }

    از این پس تمام اتصالاتی که با مدل بالا به دیتابیس وصل میشه با کانکشن mysql2 خواهد بود.

    تغییر کانکشن در کنترلر

    شاید بخواید جزئی تر شید و بخواید درون یک کنترلر خاص کانکشن رو عوض کنید . برای اینکار به راحتی از روش زیر اشتفاده کنید :

    <?php
     
    class SomeController extends BaseController {
     
        public function someMethod()
        {
            $someModel = new SomeModel;
     
            $someModel->setConnection('mysql_2');
     
            $something = $someModel->find(1);
     
            return $something;
        }
     
    }

    همونطور که میبینید با استفاده از متد setConnection()  این کار شدنیه…

    و استفاده در Query Builder :

    برای استفاده از کانکشن دیگه توی کوئوری بیلدر هم بصورت زیر عمل میکنیم :

    	
    $users = DB::connection('mysql2')->select(...);

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

    امیدوارم به دردتون خورده باشم 🙂