دسته: لاراول 5.3

  • خطای لاراول: Prepared statement needs to be re-prepared

    من هر چند وقت یبار میبینم سایت بالا نمیاد و لاگ رو چک میکنم میبینم یچی مثل خط زیر رو پروژه ی لاراول لاگ داده:

    SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL:...

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

    'options'   => [
        \PDO::ATTR_EMULATE_PREPARES => true
    ]

    یعنی الان کانکشنتون باید یچی مثل این بشه:

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    	'options'   => [
    		\PDO::ATTR_EMULATE_PREPARES => true
    	]
    ],

    من کلی گشتم تا پیدا کردم گفتم دیگه شما نگردید 🙂

  • ساختن توابع Helper در لاراول

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

    لاراول کلی هلپر خوب بصورت آماده داره که خیلی از کارهارو براتون آسون میکنه، مثل کار با آرایه ها، فایل ها، رشته ها، روت ها و یکی از پر کاربرترینشون هم همین dd خودمون :). شما میتونید هلپر های خودتون رو بصورت دستی هم تعریف کنید و با کمپوزر بصورت خودکار لودشون کنید.

    نحوه ساختن فایل Helper در لاراول

    همونطور که گفتم هلپر ها تابع هستند پس باید داخل یه فایل نوشته بشن. لاراول هیچ دایرکتوری خاصی برای helper ها در نظر نگرفته و شما میتونید بصورت دلخواه براش جا در نظر بگیرید. من مثلا داخل app/Helpers رو برای این کار در نظر میگیرم و داخلش فایل main.php رو قرار میدم.

    لود خودکار فایل ها در لاراول با کمپوزر

    یکی از کاربردهای باحال کمپوزر جدا از مدیریت نیازمندی ها، همین autoload هست که به شما این امکان رو میده که در ران تایم فایل های دلخواهتون رو توی کدتون لود کنید بدون اینکه اون بالا بنویسید require_once any.php . در پروژه لاراولتون یه فایل دارید به اسم composer.json ، توی این فایل یه key به اسم autoload وجود داره و داخلش میتونید مشخص کنید که چه فایل هایی به autoload اضافه بشن. یه مثال واستون میزنم که کاملا بدونید چی به چیه :

    "autoload": {
        "files": [
            "app/Helpers/main.php"
        ],
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

    به کمپوزر گفتم که فایل main.php  رو بذار توی autoload. حالا باید به کامپوزر بگیم که فایل های autoload رو از اول بسازه، برای این کار توی روت پروژه این کامند رو اجرا کنید :

    composer dump

    حالا main.php  و فانکشن هایی که داخلش تعریف میکنید همیشه در دسترس خواهند بود.

    تعریف توابع helper در لاراول

    توابع هلپر مثل بقیه توابع هستند فقط باید حواسمون باشه که تابع دیگه ای رو رونوشت نکنیم :

    if (! function_exists('test')) {
        function test($key, $default = null) {
            // ...
        }
    }

    هلپر ها خیلی جاها به دردتون میخورن ولی حواستون باشه که هر چی که لازم بود رو نذارید توی هلپر و فقط توابعی که زیاد ازشون استفاده میکنید رو بذارید داخلش و لذت ببرید.

    موفق باشید 🙂

  • ساخت 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 دسترسی داشته باشید و مثلا مشخص کنید که اس ام اس برای این یوزر فعال هست و شماره موبایلش تایید شده و بعد اقدام به ارسال اس ام اس به این یوزر کنید.