نوشتن سایت چند زبانه با لاراول

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

ساختار فایل های ترجمه لاراول در روش اول به این صورته:

در فولدر resource فولدر lang یک فولدر با مخفف زبان فارسی fa ایجاد کنید. و داخل اول فایل های ترجمه رو به صورت دسته بندی شده داخل هر فایل قرار میدیم. برای مثال سایت من قسمتی داره با نام  contact و ترجمه های داخل اون متفاوت از سایر قسمت های سایته. برای همین داخل فولدر fa یک فایل با نام contact.php ایجاد میکنم و داخل اون رو به صورت زیر با کلید -> مقدار پر میکنم

همونطور که توجه میکنین فایل فقط یک آرایه از توع associative رو برگشت میزنه که هر کلید یک مقدار ترجمه رو برمیگرونه.

برای استفاده از ترجمه داخل فایل های بلید مثل زیر عمل میکنیم:

همونطور که متوجه شدین این روش خیلی با نظم و دقیقه و مناسب سایت های بزرگ با ترجمه های زیاده. در این روش بهتره حتما از fallback_locale با ترجمه انگلیسی استفاده کرده باشین (اگر نمیدونین جلوتر توضیح میدم)

روش دوم که ساده و خلاصه هست، روش stringمحور که با JSON انجام میشه و برای سایت های کوچیک با ترجمه های کم مناسبه. به این صورت که در مسیر resource/lang یک فایل json با نام مخفف زبان خودمون درست میکنیم برای مثال resource/lang/fa.json که همه ترجمه ها داخل اون قرار میگیره.

که نمایش اون هم در کد خیلی راحتتره. درون بلید به این صورت استفاده میکنیم:

برای ترجمه حرفه ای تر منبع رو بخونین. اما بریم سراغ راه اندازیش:

فایل در مسیر config/app.php حاوی تنظیمات ترجمه هست که شما با تنظیم اون میتونین زبان سایت خودتون رو تغییر بدین.

اول از همه fallback_locale زبانیه که اگر ترجمه ای پیدا نشد بصورت جایگزین درنظر گرفته میشه. بهتره مقدارش همون en بمونه.

locale متغیری هست که زبان فعلیه برنامست. من اینو منتقل کردم به فایل .env برای اینکار کدتون رو بصورت زیر تغییر بدین:

حالا در فایل .env متغیر زیر رو تعریف کنین

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

در آخر چند تا از امکاناتی که لاراول بهمون میده رو بگم: میتونیم متغیر وسط متن ترجمه فراخونی کنیم. میشه بصورت داینامیک زبان رو تغییر داد و نیازی نیست داخل کانفیگ تعریف کنین و برای مثال از url پارامتر بگیرین. میتونین بصورت شرطی برای جمع و فرد ترجمه بنویسین و…

منبع :Localization

گرفتن جمع رکورد های برگشتی در لاراول ۵.۸

گاهی لازمه بدونیم یک مدل ما در رابطه با مدل دیگه ای (چند به چند و یک به چند) چه تعداد نتیجه داره؟ برای مثال میخوایم بدونیم این پست من چه تعداد کامنت داره؟ یک عدد میخوام.

برای یک مدل فقط کافیه از متد count بصورت زیر استفاده کنم. (چند نمونه مثال)

اما وقتی چند مدل/ چند رکورد از دیتابیس رو گرفتیم و میخوایم برای هر کدوم چیزی رو بشماریم از روش زیر استفاده میکنیم:

یا شمارنده های با فیلتر بیشتر یا چند شمارنده

 

منبع: Counting Related Models

متد های PUT PATCH DELETE در لاراول

اول از همه بریم سراغ متد های PUT PATCH DELETE این متد ها روش های انتقال دیتا در کنار POST GET هستن و کمتر استفاده شدن و درموردشون کمتر خوندیم و شنیدیم. اما درواقع لیست متد های تقاضاهای HTTP شامل PUT PATCH DELETE POST GET HEAD OPTIONS TRACE CONNECT میشن. که ما بیشتر از همه با POST GET کار کردیم و حالا در لاراول میخوایم از چند تای دیگشون استفاده کنیم. قبلش یه نگاه سریع بهشون بندازیم که اصلا چی هستن و برای چی استفاده میکنیم؟

حالا این نکته رو تو ذهنتون داشته باشید که CRUD مخفف اول کلمات Create Read Update Delete هست.

متد GET برای نمایش یا گرفتن داده خاص مثل یک محصول، یا یک نوع محصول یا لیست محصولات استفاده میشه.

متد POST برای ارسال یک داده به سرور استفاده میشه و معمولا برای Create کردن.

متد PUT برای ارسال داده و جایگزین کردن آن با مقادیر فعلی استفاده میشه. Update

متد PATCH هم برای ارسال داده و بروزرسانی استفاده میشه. فرقش با بالایی اینه که اون جایگزین میکنه کلا، این ویرایش میکنه. که شامل بخشی از اونه اصظلاحا Modify میکنه. اینم میشه Update

متد DELETE که مشخصه برای حذف کردنه.

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

متد HEAD مثل متد GET میمونه اما با فرق اینکه بدنه رو نمیگیره و فقط head رو میگیره. داده هایی که در هد صفحه موجوده.

متد CONNECT برای ایجاد یک تونل به منبعی مشخص

متد OPTIONS برای مشخص کردن گزینه های ارتباط با منبع مورد نظر استفاده میشود. (سخت نگیرید – سرچ کنید)

متد TRACE هم برای بررسی مسیر رفت و برگشت بسته.

همونطور که میدونیم HTML در فرم هاش از متد های PUT PATCH DELETE پشتیبانی نمیکنه، لاراول برای پشتیبانی از این route ها از ما میخواد فیلدی رو در فرممون با نام _method تعریف کنیم و مقدار اون رو برابر متد مورد نظر قرار بدیم. برای مثال کد زیر رو ببینین:

در بلید برای سرعت بیشتر میتونیم از @method استفاده کنیم که این کد رو برامون جنریت میکنه و البته، متد فرم همچنان باید POST باشه.

 

منبع:
Form Method Spoofing
HTTP request methods
HTTP Request Methods
متد های http
تفاوت بین متدهای HTTP شامل GET, POST, PUT, PATCH, DELETE

توکن CSRF فرم ها در لاراول

لاراول فرم ها رو در برابر حمله های CSRF محافظت میکنه. درخواست های سایت ها / سرور های دیگر از درخواست های یک کاربر اهراز شده جدا میشن. برای اینکار لاراول یک توکن CSRF برای هر کاربر ایجاد میکنه با اینکار چک میکنه آیا این درخواست برای همین کاربر هست یا نه؟!

برای اینکار هرزمان که ما یک فرم در HTML مینویسیم باید حتما یک توکن CSRF رو در فیلد های HTML از نوع input با مقدار توکن ایجاد کنیم. اینکار به میدلور لاراول این امکان رو میده صحت درخواست مارو بررسی کنه. برای راحتی تنها نیاز به نوشتن @csrf  داخل فرم بلیدمون داریم.

همچنین میتونیم این توکن رو در هدر صفحه هم ارسال کنیم:

یا توسط جاوا اسکریپت:

اطلاعات بیشتر درباره CSRF Protection

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

بنا به دلایل مختلف ممکنه نیاز پیدا کنیم که بدونیم کدوم کاربران ما الان لاگین کردن و چه اطلاعاتی از اونها داریم. برای مثال با چه دستگاه هایی لاگین کردن، از کجا لاگین کردن و… یا حتی محدودیت برای لاگین بخوایم بذاریم! سشن ها در لاراول در جاهای مختلفی میتونن ذخیره بشن مثل فایل ها، دیتابیس، کوکی، memcache / redis و آرایه ها (تنظیمات سشن در لاراول). برای مدیریت بهتر سشن ها اون ها رو در دیتابیس ذخیره میکنیم که امکانات زیادی به ما میده از قبیل مدیریت زمان، دسته بندی، مدیریت دستگاه ها، تعداد دستگاه ها و…

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

 

حالا داخل فایل config/session.php  درایور سشن رو به database  تغییر بدین.

ایزی ایزی تمام تمام. همین! برین دیتابیس رو نگاه کنین و راحت کوئری بزنین و کاربران رو همونطور که میخواین لیست کنین، مدیریت کنین.

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

منبع: Display user devices there application is currently logged in and option to logout in Laravel

افزودن لاگین با جیمیل (گوگل) در لاراول

در این پست بهتون میگم چطور از پکیج Socialite استفاده کنین و به وبسایتتون لاگین با جیمیل یا… رو اضافه کنین. برای شروع نیازه که ما پکیج Socialite رو بوسیله composer نصب کنیم. راهنمای خود لاراول رو اینجا ببینین:  Laravel Socialite

نصب Socialite 


کانفیک لاراول

سرویسی که میخواین (گوگل، فیسبوک، لینکداین و…) رو به config/service.php اضافه کنین.

بعد اینکه پکیج جدید رو نصب کردیم سرویس پرووایدر اون رو هم به config/app.php اضافه میکنیم

سرویس پرووایدر جایی برای راه انداری برنامه ها و پکیج هاست، خط بالا به لاراول Socialite رو برای استفاده میشناسونه.

همیشه پای یک alias هم در میونه! برای دسترسی راحتتر آلیاس اون رو هم نصب میکنیم.

تا اینجا شما میبایست ساختار اهراز هویت رو داشته باشید و در این آموزش تصور میکنیم این مرحله رو قبلا انجام دادین.

پروژه خودتون رو در گوگل https://console.developers.google.com/projectcreate درست کنین و بعد هم یک اعتبار نامه در اینجا https://console.developers.google.com/apis/credentials درست کنین.

OAuth clinet id google console
OAuth client ID > Consent > Web application

اطلاعاتی که گرفتین رو در .env فایل خودتون وارد کنین:

قراردادن آدرس برگشتی

در اینجا باید آدرس کالبک رو وارد کنین.

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

در خط اول رواتی (یا روتی) رو تعریف میکنیم که کاربر رو به گوگل میفرسته و خط دوم برگشت از گوگل با دریافت اطلاعات کاربر هست. حالا در LoginController.php متد هایی که تو روات تعریف کردیم رو وارد میکنیم. متد زیر مارو به گوگل ریدایرکت میکنه برای گرفتن اطلاعات کاربر.

و متد بعدی دریافت اطلاعات کاربر از گوگل هست (برگشت از گوگل) که اگر ایمیل قبلا وجود داشته، ثبت نام انجام میشه و اگر وجود نداشته باشه ما اون کاربر رو ایجاد میکنیم و سپس لاگین انجام میشه:

 

خب تا اینجای کار شما همه کارو انجام دادین فقط بعد اینکه پکیجی رو نصب کردین حتما دامپ کنین:

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

 

منابع:

Add Login with Google to your Laravel app
Laravel 5.5 socialite integration shows error formatRedirectUrl() must be of the type array, null given
Dynamic callback url laravel socialite

چطور در لاراول از ایمیل یا شماره موبایل برای لاگین استفاده کنیم؟ شایدم نام کاربری

برای اینکه کاربرای سایت بتونن با ایمیل یا نام کاربری یا شماره موبایل بتونن لاگین کنن (یک فیلد نام کاربری باشد که هر کدام از این ۳تا را کاربر وارد کرد بتونه لاگین کنه) تغییر خیلی کوچیکی تو متد کنترلر لاگین میدیم. برای اینکار فایل LoginController.php رو ویرایش میکنیم.

ابتدا کلاس Request رو use کنین

 

سپس متد credentials رو بازنویسی میکنیم.

تست شده در لاراول ۵٫۴ ۵٫۷ و ۵٫۸

منبع:
https://stackoverflow.com/questions/42708942/allow-login-using-username-or-email-in-laravel-5-4

راهنمای سریع استفاده از ربات تلگرام در لاراول Laravel Telegram Bot

در این مقاله خیلی سریع وخلاصه میریم سراغ ایجاد ربات و اتصال اون به لاراول.
توسط کد زیر پکیج کار با تلگرام رو به لاراول اضافه کنین:

حالا به آرایه providers که در مسیر config/app.php هست اضافه میکنیم.

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

حالا که سرویس و فاساد اون رو اضافه کردیم فایل کانفیگ تلگرام رو با دستور زیر انتشار میدیم (میاریم به فولدر config)

حالا میریم به تلگرام و ربات پدرخانده @BotFather رو استارت میزنیم با دستور /newbot یک ربات جدید ایجاد میکنیم. اول اسم ربات و دوم نام کاربری اون رو وارد میکنیم در آخر هم وقتی ربات به درستی ایجاد شد، تلگرام کد token HTTP API میده که بهش تو فایل .env نیاز داریم و به صورت زیر در این فایل وارد میکنیم:

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

به فایل config/telegram.php میریم و در قسمت ربات های نام رباتمون رو مینویسیم (قسمت username). کد زیر

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

در تلگرام هر چت (کانال، چت، گروه پی وی یا…) یه اتاق گفتگو حساب میشه و برای ارسال پیام توسط رباط ما نیاز به شماره اون اتاق داریم که البته اسمش chat_id هست. برای اینکه شماره اتاق گفتگو رو پیدا کنیم و کار با رباط تلگرام یه کنترلر برای رباط تلگرام ایجاد میکنیم:

و کد های زیر رو به کنترلرمون اضافه میکنیم

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

حالا به مرورگر میریم و آدرس /updated-activity رو تایپ میکنیم، اگر کانال ما خالی باشه مقدار [] برمیگرده ولی وقتی یک پیام ایجاد کنیم (خودمون یک پیام در کانال منتشر کنیم) و دوباره تست میگیریم. خروجی شبیه این میشه:

اگر قبلا پیامی در گروه فرستاده بودین آخرین ایندکس رو چک کنین. در این آرایه در قسمت ایندکس chat قسمت id یک شماره نوشته شده -۱۰۰۱۳۶۱۳۷۹۵۸۶ این شماره رو کپی میکنیم و در فایل .env متغیر زیر رو اضافه میکنیم

و سپس کش رو دوباره ریفرش میکنیم

حالا به کنترلر TelegramBotController متد زیر رو اضافه میکنیم

البته من مستقیم شماره chat_id رو وارد کردم ولی شما میتنین از متغیر محیطی .env استفاده کنین که کدشو کامنت کردم.
آدرس sendMessage رو در روت خودمون وارد میکنیم و بعد در مرورگر تست میکنیم.

 

منبع: https://tutsforweb.com/sending-notifications-to-telegram-messenger-with-laravel

تغییر مسیر پوشه public لاراول به public_html و دسته بندی و جمع کردن سایر فایل ها و پوشه ها در یک فولدر

در این آموزش برسی میکنیم چطور پوشه public لاراول رو به public_html یا هر نام دیگه ای تغییر بدیم و سپس بقیه فایل ها رو درون یک فولدر بریزیم و با نامی مجزا در کنار public_html داشته باشیم (برای عدم دستری از روت سایت به فایل ها و پوشه های لاراول)

فرض کنین میخوام برای پروژم فقط دو فولدر public_html و laravel داشته باشم که بجز public_html همه فایل ها و فولدر های قدیم داخل laravel باشند:

۱. ابتدا فایل index.php از فولدر public رو ادیت میکنیم

۲. فایل AppServiceProvider.php که در مسیر app/Providers هست رو ویرایش میکنیم و کد زیر رو به متد register اضافه و آدرس دهی مناسب میکنیم.

۳. فایل server.php از روت پروژه رو ویرایش میکنیم و در ۲ قسمت باید آدرس جدیمون رو قرار بدیم.

 

موفق باشید

خطای file_put_contents storage\framework/sessions failed to open stream: No such file or directory

این خطا وقتی برای من رخ داد که از اوبونتو به ویندوز مهاجرت کردم. فولدر های اصلی پروژم رو دراپباکس بود بقیه رو با کومپوزر نصب کردم. فولدر های (tests vendor storage bootstrap) رو کپی نکرم. تصور بر این بود که توسط composer نصب بشن. تا یه حدی هم نصب شدن و من دائم خطای خطای file_put_contents storage\framework/sessions failed to open stream: No such file or directory رو میگرفتم. با جستجو هایی که انجام دادم اکثرا نوشته بودن با clear cache کارت درست میشه ولی مشکل من حل نشد. بعد کلی کلنجار رفتن دستور زیر رو تایپ کردم (در ویندوز)

 

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

 

تک به تک همه کش ها رو پاک کردم تا رسیدم به آخری که خطای laravel RuntimeException : View path not found مواجه شدم و با یه جستجوی ساده و سریع به جواب درست رسیدم.

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

تو جستجو ها به یه حقه(تریک) باحال برخوردم که کار پاک کردن کش ها رو راحت میکنه. تو رَوت وبتون اینو اضافه کنین: