آشنایی با توابع Helper جدید در لاراول ۵

با سلام. همونطور که تو پست قبلی هم اشاره کردم زمان انتشار لاراول ۵ با تاخیر همراه خواهد بود و به جای ماه نوامبر در ژانویه سال جدید میلادی منتشر خواهد شد. ولی قبل از انتشار برخی از ویژگی‌های اون برای استفاده برنامه‌نویسان منتشر شده که می‌توان به توابع Helper جدیدی که کار توسعه رو خیلی لذت‌بخش تر‌می‌کنند اشاره کرد.

توابع مربوط به مسیریابی – Routing در لاراول

روش جدید:

روش قبلی:

 

توابع مورد استفاده در کنترلر‌ها و برای بازگشت دادن یک Reposnse

روش جدید :

روش قدیمی:

نوشتن در فایل Log

روش جدید:

روش قدیمی:

دستیابی به مقادیر فایل‌های Config در لاراول

روش جدید:

 

روش قدیمی:

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

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

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

تاریخچه فریمورک لاراول از سال ۲۰۱۱ شروع شد. زمانی که 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 برداشتم و با کمی تغییر تو اینجا قابل استفاده‌ش کردم.

پیاده‌سازی Repository Pattern در لاراول

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

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

 

تو کد بالا ما یه کنترلر Post داریم و یه متد index که میشه صفحه اصلی کنترلرمون و توش با استفاده از مدل Post تمام رکورد‌ها رو ریختیم داخل یه متغیر و اونو پاس دادیم به View مون. تا اینجای کار، لذت بخش و آسون بود.

مشکل کجاست؟

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

یکی دیگه از مشکلات هم برمیگیرده به زمانی که بخواهیم نوع دیتابیسمونو عوض کنیم. مثلن بخواهیم از mongoDB به جای Mysql یا هر نوع دیتابیس از نوع Sql، استفاده کنیم. خب، توی استفاده از انواع Sql دیگر مثل SqlServer یا Postgesql نباید مشکلی باشه و نیازی نیست کدمونو تغییر بدیم ولی اگر به mongoDB بخواهیم کوچ کنیم مجبوریم تمام قسمت‌های کدمونو بازنویسی کنیم که این به دور از اصول توسعه سریع و تمیزه.

راه حل چیه؟

یکی از بهترین راه‌حل ها استفاده از Repository ها برای جدا کردن مدل‌ها از کنترلر‌هامون و مدیریت Dependency Injectionهاست. خب اول باید ببینیم Repository چی کار می‌کنه؟ Repositoryها میان یه واسطی میشن به بخش دیتابیس و کنترلرهامون و مثل یه تونل و فیلتر عمل می‌کنن تا ما از یک نوع کدنویسی و استاندارد برای ارتباط با پایگاه‌های داده اعم از (Redis, Sql, NoSql) استفاده کنیم.

به طور کلی Repositoryها به معنای ارتباط دهنده بین دو چیز هستند.

اگر به واژه رابط یا واسط توجه کرده‌باشد درمی‌یابید که Repository چیزی نیست جز interfaceها. بله، ما به کمک یکی از امکانات شی‌گرایی برای حل این مشکلات استفاده می‌کنیم.

حالا کد بالا رو می‌خواهیم بازنویسی کنیم:

ابتدا یک Repository برای Post ایجاد می‌کنیم:

 

سپس میاییم یک کلاس دیگر که از این interface ارث برده را ایجاد می‌کنیم: (توجه داشته باشید تمام کلاس‌هایی که از interfaceها implement می‌شوند باید تمام متدهایی که در interface نام برده شده‌اند‌ را داخل خودشون پیاده‌سازی کنند:

ما یک کلاس برای کار با انواع دیتابیس Sql ایجاد می‌کنیم و همونطور که میدونید برای این کار از کتابخونه Eloqunet لاراول استفاده می‌کنیم:

 

حالا کنترلرمونو بازنویسی می‌کنیم:

 

همونطور که میبینید دیگه کنترلر ما براش فرق نمیکنه که از چه نوع دیتابیسی استفاده کنه. ما به راحتی می‌تونید کلاس مربوط به اونو بنویسیم و با استفاده از Ioc Container لاراول، اونو به عنوان مدلمون معرفی کنیم.

چیزی که تو این پست نوشتم یه خورده خورده کاری داره مثل bind کردن کلاسمون به interface تا بتونیم تو پروژه‌هامون ازش استفاده کنیم که به صورت تفصیلی تو پست‌های آینده در موردش صحبت می‌کنم. فقط میخواستم یه دیدی از این کار داشته باشید.

اضافه کردن کلاس‌ها و 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تون تو پروژه‌تون به راحتی استفاده کنید و یادتون باشه از لاراول لذت ببرین.

افزودن قابلیت Auto Complete به IDEها برای توسعه لاراول

سلام

یکی از قابلیت‌هایی که برنامه‌نویسان از اون در هنگام کدنویسی خیلی بهره‌ می‌برند، قابلیت تکمیل خودکار عباراته. تمام IDE‌ها این قابلیت رو دارن ولی بعضی‌هاشون خیلی هوشمندن مثل Visual Studio و Jetbrain PhpStorm و بعضی‌هاشون امکانات و هوشمندی کمتری دارند، مثل Sublime ُText.

Laravel IDE Helper

هوشمندی ویرایشگر‌های کد برای Completion شامل امکانات موجود در زبان، متغیر‌ها، توابع و کلاس‌ها هست ولی بعضی موقع بعضی چیزارو تشخیص نمی‌دن. مثل کلاس‌ها یا فایل‌هایی که در هنگام اجرا قراره کنار هم قرار بگیرند و یا ارث‌بری‌های کلاس‌های مختلف.

یکی از فریمورک‌هایی که این روزا خیلی سر و صدا کرده لاراوله و بالطبع برنامه‌نویسان دوست دارن تو محیطی کد بزنن که بیشترین امکاناتو در اختیارشون قرار بده. خوب به صورت پیش‌فرض IDEهایی مثل PhpStorm, Eclipse, Aptana, Netbaens تا حدودی هوشمندی دارن و کم و بیش کلاس‌ها و فایل‌های یک پروژه رو تشخیص می‌دن ولی برای بهره‌برداری هرچه بیشتر باید یه کارایی بکنید تا اسکریپتتون به صورت کامل توسط IDE پشتیبانی بشه.

خوشبختانه برای فریمورک لاراول یک پکیج وجود داره که با نصبش به راحتی قدرت کامل فریمورک رو روی IDE بهتون میده.  Laravel IDE Helper، یه پکیجیه که مثل بقیه پکیج‌های لاراول میتونین اونو با composer نصب کنین و با نوشتن یکی-دو خط کد و تنظیمات از این مهم بی ‌نصیب نمونین.

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

 

بعد با استفاده از ترمینال(command-line) دستور زیر را وارد کنید (در دایرکتوری اصلی پروژه) :

 

بعد از اون وارد فایل laravel/app/config/app.php بشین و عبارت زیر را به آرایه providers اضافه کنید:

 

بعد از این کار دوباره وارد ترمینال شده و عبارت زیر را وارد کنید  (در دایرکتوری اصلی پروژه) :

 

الان دیگه محیط توسعه نرم‌افزارتون یا همون IDE به راحتی تمام کلاس‌ها و توابع و اشیا رو شناسایی می‌کنه و می‌تونین از کد زدن لذت ببرین.

برای اطلاعات بیشتر و تنظیمات دیگه به این آدرس برید.