بایگانی دسته: Laravel

آموزش فریمورک لاراول laravel

یک ربات ساده تلگرام با لاراول

نوشته‌شده در توسط .

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

تصور غلط در مورد ربات تلگرام

یه سری از افراد چون به اسم ربات میرسن، فکر میکنن که ربات دستش برای همه چیز بازه و من خیلی ها رو دیدم که رباتی میخوان که یک خواسته نامعقول رو انجام بده. ربات با api تلگرام کار میکنه و هر درخواستی که توی api تلگرام وجود داره رو میشه با ربات صادر کرد و نه بیشتر. برای اطلاعات بیشتر میتونید به مستندات تلگرام در مورد ربات تلگرام مراجعه کنید.

ساخت یک ربات خام در تلگرام

عملیات ساخت ربات تلگرام خودش از طریق یه ربات انجام میشه، بات فادر اسم رباتی هست که این کار رو انجام میده و برای دیدن اون میتونید به این آیدی مراجعه کنید : @BotFather، نحوه ساخت ربات با botfather خیلی مشخصه و نیازی به توضیح نیست. بعد از ساخت ربات یه توکن به ربات تعلق میگیره و از این به بعد این توکن بعنوان شناسه ربات شما استفاده میشه. توکن شما یه چیزی شبیه  ۱۲۳۴۵۶:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 هست که توی این نوشته به اختصار از  <token>  برای نشون دادنش استفاده میکنیم.

نحوه ی اهراز هویت ربات توسط تلگرام

همه درخواست های شما به آدرس زیر ارسال خواهد شد :

که  METHOD_NAME  نام متدی هست که قراره در هر درخواست ازش استفاده کنید.

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

  1. دریافت آپدیت ها با ارسال لحظه ای درخواست از طرف شما
  2. تنظیم وب هوک برای دریافت آپدیت بدون ارسال درخواست لحظه ای

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

درخواست  getUpdates ربات تلگرام

در این روش شما offset و limit رو میدید و آپدیت های مورد نظر رو دریافت میکنید. توجه کنید که offset بر اساس آیدی پیام ارسال میشه نه چیز دیگری.

تنظیم  setWebhook برای ربات تلگرام

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

استفاده از پکیج irazasyed/telegram-bot-sdk

اگه توی لاراول دارید کار میکنید میتونید از irazasyed/telegram-bot-sdk استفاده کنید. این پکیج کارتون رو خیلی راحتتر میکنه… بعد از نصب این پکیج میتونید برای تست اون از طریق زیر عمل کنید

ابتدا توی فایل  .env  توکنی که برای ربات دریافت کردید رو بصورت زیر وارد کنید

و توی کدتون هم یچیزی مثل این رو بنویسید

در صورتی که اطلاعات ربات رو دریافت کردید ینی ربات شما درست ایجاد شده است. تنها کاری که الان باید بکنید اینه که یه route رو از csrf protection در بیارید و اون روت رو بعنوان url برای هوکتون در نظر بگیرید و درخواست ها رو هندل بکنید.

 

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

نوشته‌شده در توسط .

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

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

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

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

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

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

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

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

 

ذخیره کردن شکلک ها در MySQL

نوشته‌شده در توسط .

اخیرا که ملت همه ریختن تو شبکه اجتماعی و با شکلک – ایموجی – ها و… سروکار دارن ما هم باید بتونیم کارشون رو راه بندازیم 🙂

کانکشن پیشفرض MySQL لاراول به صورت پیشفرض از کاراکتر ست utf8 استفاده میکنه که نمیتونه شکلک ها رو ذخیره کنه و معمولا با این خطا مواجه میشیم :

برای حل این مشکل کانکشن mysql  در  config/database.php  رو به صورت زیر اصلاح کنید :

و دیتابیس رو ریست کنید. حواستون باشه که از دیتاتون قبلش بکاپ بگیرید…

مشکل migrate در لاراول ۵

نوشته‌شده در توسط .

اگه بعد از  php artisan migrate  کردن اررور زیر رو میگیرید :

توی فایل  app\database.php  مقدار  localhost  رو به  ۱۲۷٫۰٫۰٫۱  تغییر بدید… معمولا توی ابونتو همچین مشکلی هست …

نوتیفیکیشن های لاراول ۵٫۳

نوشته‌شده در توسط .

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

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

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

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

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

 

استفاده از Notifiable Trait

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

استفاده از فساد Notification

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

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

nodejs در مقابل php

نوشته‌شده در توسط .

اخیرا مجبور شدم روی یک پروژه چت آنلاین کار کنم که یک موتور چت داره و یک سری ریکوئست رو میگیره و جواب مناسب رو میده…  با php و فریمورک لاراول (♥) و وب سرور آپاچی شروع کردم  برای هرچه بهینه تر شدن موتور از روش comet استفاده کردم که یک درخواست رو تا دریافت درخواست بعدی به تاخیر میندازه و خلاصه به روشی خلاقانه باعث پایین اومدن حجم درخواست ها به سرور و در عین حال real time شدن کامل برنامه میشه. واضحه که با این حجم read و write که توی همچین سیستمی وجود داره، mysql گزینه مناسبی برای مدیریت داده ها نیست و بخاطر همین از همون اول از mongodb بعنوان یک سیستم مدیریت پایگاه داده noSQL استفاده کردم…

تا اینجا یه موتور چت (chat engine) با لاراول و مانگو دارم… برای تست ، ۲۰ کاربر با سشن های مختلف روش فعال کردم که هر کدوم دارن چت میکنن و بیشتره تایم رو هم گوش میکنن و منتظر دریافت پیام طرف مقابلن… با ۲۰ تا کاربر با اینکه منابع نسبتا بالایی از سرور استفاده میشد ولی سرعت جواب ها قابل قبول بود… وقتی تعداد کلاینت های سیستم پایین هست بالطبع تعداد درخواست هایی که برای سیستم میاد هم پایین خواهد بود و مشکلی پیش نمیاد… اما وقتی تعداد کلاینت ها رو ۱۰۰ برابر کردم… بووووم… سیستم ترکید☺

اینجا بود که به ضعیف بودن php و یه وب سرور مثل آپاچی ایمان آوردم… یه چرخی تو اینترنت زدم و مقاله هایی رو خوندم که دقیقا حرف الان من رو تایید میکردن… کم کم با پدیده ای به نام nodejs آشنا شدم… syntax و داکیومنت خوبش باعث شد که سمتش برم و موتور چت رو ببرم روی node…

گرچه تحقبق روی پروژه انقد طولانی شد که شرکت، پروژه رو شکست خورده تلقی کرد و رفتم روی پروژه ی بعدی… ولی به شما پیشنهاد میکنم اشتباه من رو تکرار نکنید و اگه سیستم مشابهی رو برای کارتون نیاز دارید به node بعنوان یک گزینه خوب نگاه کنید… یه مقایسه قشنگه node و php رو هم توی این لینک ببینید. موفق باشید 🙂

 

حل مشکل Warning: putenv() has been… در laravel

نوشته‌شده در توسط .

Warning: putenv() has been disabled for security reasons in /home/yoursite/public_html/vendor/vlucas/phpdotenv/src/Dotenv.php on line 86

اگه ورژن php هاستتون زیر ۵٫۶ باشه این پیام نمایش داده میشه… برای حل این مشکل از قسمت select php version هاستتون اقدام کنید و یا با پشتیبانی هاستتون تماس بگیرید

کارکردن با pivot table ها یا جداول محور در laravel

نوشته‌شده در توسط .

مجددا باید بگم که من همه کارام رو توی لاراول ۵٫۰٫۰ انجام میدم 🙂

امروز میخوام در مورد یک چیز خیلی مهم توی لاراول صحبت کنم… نحوه ی ارتباط برقرار کردن چند به چند بین دو جدول در لاراول ۵٫

یک مثال کاملا واقعی در مورد رابطه های چند به چند در لاراول

توی داکیومنت رسمی لاراول مثالی که واسه روابط چند به چند اومده ، رابطه ی role و user هست که یک یوزر میتونه متعلق به چند نقش باشه و برعکس ، یعنی یک نقش مثل ادمین هم میتونه متعلق به چند کاربر باشه . من یه مثال ملموس تر براتون میزنم : رابطه ی محصولات و فروشگاهها رو در نظر بگیرید. شما نیاز دارید که بدونید مثلا گوشی فلان رو چه فروشگاههایی دارن و همچنین نیاز دارید بدونید که فلان فروشگاه چه گوشیهایی داره…

جدول های مورد نظر میتونن به شکل زیر باشن :

shops
– id
– name

products
– id
– name

product_shop
– product_id
– shop_id

برای اینکه بین ذو جدول رابطه چند به چند بوجود بیاد ، بهترین راه استفاده از یک جدول میانی هست که ارتباط بین دو جدول رو تشکیل بده. این جدول حداقل باید دو فیلد داشته باشه ، که آیدی دو ریکورد از دو جدول رو به هم نسبت بده…

برای اینکه این جدول رو درست کنیم میتونیم از مایگریشن های خود لاراول استفاده کنیم… مثلا در یک وبلاگ ، پست ها و تگ ها دارای رابطه چند به چند هستند که جدول post_tag رو میتونیم به صورت زیر بسازیم :

 

جدول  post_tag  رو اصطلاحا بهش میگن pivot table… نام جدول pivot باید بصورت First_Second باشه که First نام جدول اول و Second نام جدول دوم هست… ترتیب هم باید بر اساس حروف الفبا باشه…  بصورت پیشفرض جدول pivot دوتا فیلد داره : post_id و tag_id که میتونید فیلد های بیشتری هم بهش اضافه کنید . مثلا برای اینکه شما یک پلن رو به یک کاربر اختصاص بدید میتونید تاریخ پایان پلن رو هم توی جدول میانی یا همون pivot ذخیره کنید. برای بدست آوردن مقدار فیلد های دیگه هم میتونید از این روش استفاده کنید :

 

حل مشکل invalid default value for created_at در لاراول

نوشته‌شده در توسط .

در ادامه طرح سوالات ابتدایی لاراول ، این پست رو منتشر میکنم 🙂

توی اولین مرحله که میخواید مایگریشن های لاراولیتونو ران کنید به این اررور احتمال داره بخورید :

این خطا بخاطر اینه که مای اس کیو ال شما مقدار صفر رو بعنوان مقدار پیشفرض تاریخ قبول نمیکنه . احتمالا شما  NO_ZERO_DATE رو توی تنظیمات mysqlتون فعال کردید… اگه با ومپ کار میکنید به پوشه ی (مثلا)  C:\wamp64\bin\mysql\mysql5.7.9  برید و فایل my.ini  رو باز کنید و مقادیر  NO_ZERO_DATE,NO_ZERO_IN_DATE, رو سرچ بزنید و حذف کنید و mysql رو ریستارت کنید

الان همه چی حله…  php artisan migrate  رو برای تست ران کنید.

آموزش نصب Illuminate/HTML در لاراول ۵

نوشته‌شده در توسط .

چند روزیه تو یه گروه تلگرامی لاراول عضوم ، انقد سوالای سطح پایین پرسیده میشه که قلبت درد میگیره… تصمیم گرفتم هر از چندگاهی در مورد مقدمات لاراول حرف بزنم و خب اولین چیزی که ملت درگیرشن همین Illuminate/HTML هست… توی لاراول ۴ هلپر  HTML بصورت پیشفرض وجود داره و توی لاراول ۵ برداشته شده… خوشبختانه HTML بصورت یه پکیج جدا وجود داره و میتونید ازش استفاده کنید براحتی…

برای نصب Illuminate/HTML ابتدا کد زیر رو توی روت پروژه ران کنید :

قدم دوم اینه که /config/app.php  رو باز کنید و خطهای زیر رو اضافه کنید :

الان همه چی حله… برای تست هم میتونید از ابزار tinker استفاده کنید

موفق باشید 🙂

الان دیگه html از هسته لاراول جدا شده و بصورت پکیج جدا از illuminate در laravelcollective.com توسعه داده میشه… برای نصبش توی composer.json کد زیر رو اضافه کنید :