اعتبارسنجی با سناریوهای مختلف در لاراول

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

Validation‌ها در هر نرم‌افزار یا وب‌اپلیکیشن از ملزومات توسعه هستند و هر برنامه‌نویسی نیاز داره تا در شرایط مختلف و سناریوهای‌ مختلف ورودی‌هایی که از طرف کاربران میاد رو اعتبارسنجی کنه تا از درستی داده‌ها اطمینان حاصل کنه. یکی از روش‌های این کار در Laravel اینه که ما تو کنترلر Ruleها رو تعریف کنیم و داده‌های ورودی از سمت کاربر رو بهش بدیم و همونجا جواب رو برگردونیم. تو روش زیر یه خورده قضیه فرق می‌کنه. Ruleها در یه کلاس جدا برای هر موجودیت و در سناریوهای مختلف ذخیره میشن و ما بر اساس نیازمون از یکی از اون سناریوها در بخش‌ها مختلف کدمون استفاده می‌کنیم.

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

 

حالا فرض کنیم میخواهیم Ruleهای مربوط به کار با موجودیت User رو به وسیله این پکیج مدیریت کنیم. خب برای این‌کار من یه فولدر به نام Validator در پوشه app ایجاد می‌کنم تا تمام کلاس‌های مربوط به اعتبارسنجی‌هام توی این دایرکتوری باشن. برای شروع یک کلاس به نام app/Validators/UserValidator.php ایجاد می‌کنم به شکل زیر:

 

همونطور که دیدید کلاس‌های اعتبارسنج باید از کلاس AbstractValidator مشتق بشن. در مرحله بعدی باید Ruleهامون رو به کلاس اضافه کنیم که برای نمونه من به کلاس بالا دو تا سناریو اضافه می‌کنم:

 

من در کد بالا دو تا سناریو تعریف کردم، یکی برای اعتبارسنجی داده ورودی کاربر در هنگام ثبت‌نام و دیگری در هنگام ورود به سایت و اهراز حویت. تمام سناریوها به شکل بالا نوشته میشن یعنی نام سناریو + پسوند Rules.

بعد از اینکه سناریوها تعریف شدند، هر جایی می‌تونیم کلاس ولیدیشنمونو استفاده کنیم. حالا نحوه استفاده ش تو یه کنترلر به شکل زیر میتونه باشه:

 

مثال کد بالا یه کنترلر و یه متد برای ثبت‌نامه که ما اومدیم کلاس UserValdiator رو inject کردیم به متدمون و ازش استفاده کردیم. همونطور که میبینید کافیه هنگام استفاده، اسم سناریومون رو تعیین کنید و با صدا زدن متد validate() داده‌هامون رو برای اعتبارسنجی بهش بدیم.

اگر خطایی رخ بده، اکسپشن ValidationException فراخوانی میشه که این اکسپشن دارای متدی به نام getErrors()ـه که حاوی پیام‌های خطای اعتبارسنجی‌مونه و اگر خطایی رخ نده برنامه به کارش ادامه میده.

به دو روش میشه روی‌ دادن این خطا رو مدیریت کرد. یکیش به روشیه که تو مثال کد بالا میبینید و روش دیگه ش اینه که خطا رو تو فایل app/Exceptions/Handler.php مدیریت کنیم که روش دوم بیشتر هنگام نوشتن Apiها برای اینکه کد کمتری بنویسیم کاربرد بیشتری داره.

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

تاریخ شمسی برای لاراول ۵

یکی از نیازهای برنامه‌نویسای ایرانی تو توسعه وب‌سایت‌ها و اپلیکیشن‌ها، تبدیل تاریخ میلادی و شمسی و بالعکسه. برای این کار کتابخونه‌ها و ابزارهای مختلفی برای فریمورک‌ها و زبان‌های برنامه‌نویسی مختلف وجود داره. برای  لاراول ۴ و نسخه‌های قبل‌تر از اون پکیج‌هایی بودند که کار خیلی‌ها رو برای تبدیل تاریخ راه مینداخت، ولی از نسخه ۵ Laravel یک خلاء وجود این کتابخونه با توجه به عدم توسعه پکیج‌های قبلی به وجود اومده، البته اگر نخواهیم از پکیج‌های مخصوص لاراول استفاده کنیم و به پکیج‌های دیگه زبان PHP بسنده کنیم هیچ مشکلی وجود نداره ولی خب بعضی‌ها دوس دارن برای آرامش خاطر هم شده پکیجی باشه که برای لاراول ۵ ساخته شده باشه.

همونطور که مستحضر هستید برای بومی سازی پکیج‌ها و کتابخونه‌ها برای یک فریمورک خاص باید از Service Providerها استفاده کنیم، خب Laravel هم از این قاعده مستثنی نیست. در گذشته پکیج تاریخ‌جلالی که توسط سالارکابلی نوشته شده بود و Bundle اون برای لاراول ۳ استفاده می شد و در لاراول ۴ هم Milad Rey پکیجی نوشته بود که نسخه بهبود یافته اون باندل برای لاراول ۴ بود ولی این پکیج برای لاراول ۵ توسعه داده نشد.

از این رو دست به کار شدم و پکیج مذکور رو برای Laravel ۵ آماده کردم و یه سری تغییرات بسته به نیاز خودم (شاید به درد بقیه هم بخوره) در اون اعمال کردم. برای دریافت این پکیج می‌تونید با استفاده از composer به روش زیر عمل کنید:

سپس فایل config/app.php رو باز کرده و مقادیر زیر رو در آرایه‌های خودشون قرار می‌دیم:

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

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

ساخت تصاویر بند انگشتی به وسیله لاراول

سلام

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

یه راه حل دیگه اینه که بیاییم به صورت اتوماتیک تصاویرمونو به وسیله اسکریپت resize کنیم. که این خودش نیازمند برنامه‌نویسی و محاسباته(هر چند اندک). با زبان PHP به راحتی میتونیم این مهم رو پیاده سازی کنیم.

کاری که تو این مطلب می‌خوام به شرحش بپردازم نوشتن تابعی برای resize کردن تصاویر در لحظه به وسیله فریمورک محبوب لاراول و پکیج دوست‌داشتنی intervention/image ـه. خب شروع کنیم به کار:

نصب پکیج intervention/image:

خب نیازمندی‌های این پکیج به این ترتیبه:

  • php >= 5.3
  • Fileinfo extension
  • GD lib >= 2.0 یا Imagic PHP extension >= 6.5.7

ابتدا نام پکیج و نسخه مورد نیازمونو در فایل composer.json در قسمت require اضافه می‌کنیم:

سپس به وسیله ترمینال دستور زیر را در دایرکتوری فایل composer.json اجرا می‌کنیم تا پکیج نصب شود:

بعد از اون فایل config/app.php را باز کرده و خطوط زیر را به ترتیب در آرایه‌های providers  و aliases  اضافه می‌کنیم:

و

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

 کد زیر دربردارنده کنترلر و متد ایجاد تصاویر بندانگشتی با سایز‌های دلخواهه که توضیحات به صورت کامنت در کد قرار داره:

 

تعریف  Route برای دسترسی به متد:

برای دسترسی به متدمون و فراخونی اون از هر جای اپلیکیشن نیازمند تعریف یک مسیر یا Route هستیم. برای اینکار فایل routes.php را باز کرده و مسیر جدیدی تعریف می‌کنیم:

 ایجاد تصاویر بندانگشتی:

در مرحله آخر می‌رسیم به استفاده از اسکریپتمون. برای این کار فرض کنیم ما تصویری داریم با این آدرس: http://site.com/images/image1.png که دارای سایز ۱۳۶۰x768ـه و ما میخواهیم تصویری با پهنای ۲۰۰ بسازیم و میخواهیم که ارتفاع تصویر هم به نسبت پهنا تغییر کنه. پس فقط کافیه آدرس زیر رو تو هر جای اپلیکیشن( چه کنترلرها و چه داخل کدهای html) صدا بزنیم:

که در صورت عدم وجود تصویر اصلی، تصویری با رنگ خاکستری روشن و به سایز ۲۰۰x200 ایجاد میشه و در صورت وجود تصویر اصلی، تصویری بندانگشتی به سایز ۲۰۰x113 پیکسل ایجاد میشه. در صورتی که بخواهیم با  ارتفاع دلخواه خودمون تصویر ساخته بشه کافیه پارامتر h را به تابع route بدیم.

راهنمایی:

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

 

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

فقط یادتون باشه که بعد از اینکار باید apache را restart یا  reload کنید، اونم با این دستور:

موفق باشید.

تاریخچه لاراول

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

فریمورک لاراول

تاریخچه فریمورک لاراول از سال ۲۰۱۱ شروع شد. زمانی که Taylor Otwell (خالق لاراول) اولین نسخه از فریمورک لاراول را ایجاد کرد و تغییرات مهمی را در زمینه و روش کدنویسی php پایه‌ریزی کرد. اولین کاری که وی انجام داد، حل مشکلاتی بود که با رشد و بزرگ‌تر شدن فریمورک محبوب codeigniter به وجود آمده بودند و همین امر باعث کوچ بسیاری از برنامه‌نویسان codeigniter به Laravel شد.

در نسخه دوم لاراول تیلور سعی کرد تا روشهایی برای نوشتن کد تمیز و سریع‌تر در php ابداع کند و شعارش هم این بود: «خودتو از دست کد اسپاگتی خلاص کن»

نسخه سوم لاراول همراه بود با رونمایی از سایت محبوب این فریمورک به آدرس http://laravel.com که یک داکیومنتشن کامل و جامع لاراول می‌باشد. Taylor در این نسخه بیشتر روی همگام سازی لاراول با تست واحد یا Unit Testing، ارایه ابزار تحت خط-فرمان Artisan که یه چیزیه مثل bake توی فریمورک cakephp و یا oil در فریمورک FuelPHP، Database migration، رویدادها در لاراول و همچنین درایورهای بیشتر برای کار با sessionها و دیتابیس‌های مختلف تمرکز کرده بود.

همچنین بهینه‌سازی پشتیبانی bundleها که نقطه قوت لاراول محسوب می شدن و جدا کردن Eloquent ORM از هسته فریمورک و ارائه آن به صورت bundle از دیگر کارهایی بود که در این نسخه انجام شد.

بعد از نسخه ۳ که لاراول طرفداران بسیاری جمع کرده بود، Taylor در نسخه ۴ تغییرات بنیادینی رو اعمال کرد که این کار عمل مهاجرت از نسخه قبل به جدید را به شدت مشکل می‌کرد ولی تغییرات نسخه ۴ واقعاً عالی بودند و برنامه‌نویسان با روی باز از این تغییرات استقبال کردند.

لاراول ۴ از بهترین مدیر بسته‌ها برای php که composer نام داره، استفاده کرد که این کار باعث پشتیبانی لاراول از بسیاری از بسته‌های و کامپوننت‌های بینظیری می‌شد که برنامه‌نویسان سراسر جهان برای زبان php نوشته بودند و به نظرم این حرکت، یک حرکت انقلابی بود.

نسخه‌ای که الان همه از اون دارن استفاده می‌کنن نسخه ۴٫۲ این فریمورکه و نسخه بعدی که قرار بود اواسط همین ماه میلادی عرضه بشه ولی موکول شد به سال جدید میلادی، نسخه ۵ نام داره که باز هم تغییرات محسوسی در معماری Laravel ایجاد شده و همه منتظریم تا هرچه زودتر منتشر بشه.

البته این نسخه به صورت نسخه آزمایشی هم‌اکنون در GitHub قابل دسترسیه ولی من خودم دوست دارم از نسخه پایدار استفاده کنم، پس منتظر می‌مونم.

ایجاد slug با قابلیت پشتیبانی از زبان فارسی در لاراول

برای داشتن urlهای تمیز و  SEO Friendly در برنامه‌های تحت وب راههای زیادی وجود داره. در لاراول به صورت پیشفرض می‌تونید به روش زیر slug یا نامک از رشته‌هاتون درست کنید:

 

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

Eloqunet Sluggable یک پیکج برای تولید تولید اتوماتیک slug در لاراول می‌باشد که میتونید با مراجعه به صفحه گیت‌هاب این پکیج با اون روش نصبش آشنا بشید.

بعد از نصب و ایجاد تنظیمات مربوطه می‌تونید توی مدل‌هاتون ازش استفاده کنید . روش کار هم به این صورته که شما به طور فرض یک مدل دارید با نام Post. خب باید مدلتون یه چیزی شبیه زیر باشه:

 

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

 

بعد از انجام کارهای بالا حالا دیگه شما به راحتی پس از ایجاد یک پست جدید و انتخاب یک عنوان، slug اون رو هم به صورت اتوماتیک داشته باشید. مثلا:

 

خب تا اینجای کار، همه چیز مرتبه ولی یه مشکل بزرگ وجود داره و اون هم عدم پشتیبانی این پکیج و متد Str::slug() از زبان‌های یونیکد مثل فارسیه و این یعنی این پکیج و متد به درد ما نمی‌خورن. ولی باز هم راه حل وجود داره که به این ترتیبه:

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

 

حالا اگه به فولدر app/config/packages/cviebrock/eloquent-sluggable برید فایل تنظیمات با نام config.php اونجا قرار داره.

حالا اگه فایل تنظیماتو باز کنید میبینید که گزینه‌های مختلفی برای اعمال کردن داره مثل unique که مشخص می‌کنید که slugهاتون در دیتابیس یکتا باشند یا نه که یکتا بودنشون تو آدرس‌دهی میتونه خیلی کمک کنه و یا گزینه on_update که مشخص می‌کنید آیا نامک در هنگام به روزرسانی رکورد به روزرسانی بشه یا نه که پیشنهاد می‌کنم اینو به true تغییر بدید.

یک گزینه دیگر وجود داره به نام method که میتونید در این گزینه متد و یا تابع دلخواهی که میخواهید slugهاتون بر اساس اون ساخته بشن رو تعریف کنید. به صورت پیش‌فرض Eloquent-sluggable از متد Str::slug() برا ساختن نامک استفاده می‌کنه که مشکلشو با زبان فارسی فهمیدیم چیه.

برای پشتیبانی از زبان‌های یونیکد فقط کافیه که متد زیر را به اون گزینه نسبت بدید و فایل config.php رو save کنید. بعد از اون به راحتی میتونید برید دنبال بقیه کارهاتون 😉

 

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

اضافه کردن کلاس‌ها و Helperهای شخصی به Laravel

سلام

یکی از ویژگی‌های فریمورک‌ها، قابلیت اضافه‌ کردن کلاس‌ها و کتابخانه‌هاییست که توسط خودتون یا فرد دیگری نوشته شده. لاراول تو این زمینه دستتونو کاملا باز گذاشته.

laravel

یکی از اشکال این کتابخونه‌ها یا کلاس‌ها پکیج‌ها هستند که در آینده در موردشون بیشتر صحبت می‌کنیم. ولی امروز می خواهیم در مورد اضافه کردن کلاس‌های دم دستی و یا Helperها به Laravel صحبت کنیم.

فرض کنید یه سری تابع و متد داریم که برای راحت‌تر شدن کارمون و تمیزکاری اونارو یه جا بنویسم و بعد ازشون استفاده کنیم. راحت‌ترین حالت ممکن اینه که بریناون تابع‌ها رو به فایل route.php, filter.php, start.php و یا هر فایل دیگه‌ای که موقع اجرای لاراول مورد استفاده هستند بنویسم و و در جاهای دیگه ازشون استفاده کنیم. ولی این کار کدمونو کثیف و نامرتب می‌کنه.

برای افزودن یک کلاس Helper به این ترتیب عمل می‌کنیم:

ابتدا یک دایرکتوری به دایرکتوری app اضافه می‌کنیم مثلن به اسم helpers:

 

بعد از اون یه فایل php داخل دایرکتوری مذکور ایجاد کرده و هر اسمی خواستیم روش میذاریم، فقط یادتون باشه بعدن با این اسم کار داریم. مثلن یه فایل میسازیم به اسم Helper.php

بعد از اضافه کردن فایل داخل اون شروع می‌کنیم به نوشتن متدهامون. یادتون باشه اون فایل Helper.php داخلش یه کلاس به همین نام باید باشه اونم از نوع static، به این صورت:

 

هر چند‌تا متد خاصتین میتونین توش ایجاد کنید ولی بازم یادتون باشه باید همشون از نوع static باشن.

حالا تو هر جای پروژه‌تون میتونید به این شکل از کلاس Helperتون استفاده کنید، مثلن:

 

ولی موقع اجرا میبینید که بهتون اخطار میده که همچین کلاسی وجود نداره. خب درسته چون ما این کلاسمونو داخل پروژه load نکردیم. برای این کار فایل composer.json اصلی لاراولو باز می‌کنیم و آدرس فولدر Helperمون رو در قسمت autoload -> classmap اضافه می‌کنیم. مثل این:

 

بعد از اضافه کردن و ذخیره کرده فایل composer.json، ترمینالو باز کرده( جایی که فایل composer.json وجود داره) و عبارت زیر را وارد می‌کنیم:

 

به همین راحتی الان می‌تونید از Helperتون تو پروژه‌تون به راحتی استفاده کنید و یادتون باشه از لاراول لذت ببرین.