استفاده از Doctrine ORM در Laravel به جای Eloqunet

Doctrine ORM از  نسخه دوم معماریشو از نوع ActiveRecord به DataMapper تغییر داد. اگه نمیدونید فرق این دو تا چیه این بلاگ پست رو بخونید. همونطور که میدونید لاراول به صورت پیشفرض از  ORM بسیار خوب و قوی Eloquent که توسط تیم همین فریمورک طراحی شده استفاده میکنه که معماریش ActiveRevordایه ولی اگه شما هم مثل من به سرتون زده که از یه ORM دیگه استفاده کنید، ادامه بدید به خوندن این پست وگرنه فکر نمیکنم فایده‌ای داشته باشه براتون.

من از Doctrine تو فریمورک‌های Yii و Symfony قبلا استفاده کردم و تقریبا بهش مسلطم واسه همین قصدم اینه که به دلایلی مثل کد تمیزتر و جدا بودن لایه Data Persistence از لایه Domain و … از این ORM توی پروژه‌های لاراولیم هم استفاده کنم. خب برای این کار چند راه داریم یکیش و سخت‌ترینش اینه که Doctrine رو با Composer نصب کنیم و خودمون شروع کنیم به integrate کردنش با لاراول. خب وقتی قبلا افرادی بودن که همین قضیه به فکرشون رسیده و این کارو انجام دادن، چرا باید دوباره خودمون  چرخو از اول اختراع کنیم؟ LaravelDoctrine یه پکیجیه که این کارو برامون آسون میکنه و برای داشتن Doctrine روی لاراول به ترتیب زیر عمل میکنیم:

نصب Doctrine

ابتدا پکیج  laravel-doctrine/orm رو با توجه به نسخه لاراولمون نصب میکنیم. من خودم از لاراول نسخه ۵٫۱٫* استفاده میکنم، نسخه‌ای که باید از این پکیج نصب کنم به این ترتیبه:

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

Screenshot from 2016-07-25 12-57-31

بعد از اینکه نصب شد، Service Provider این پکیج را به آرایه Providerهامون توی فایل config/app.php  اضافه میکنیم:

در مرحله بعدی باید فایل تنظیمات laravel-doctrine/orm  رو با فرمان زیر به دایرکتوری configs  اضافه میکنیم:

بعد اینکه این کارها رو انجام دادیم، تقریبا همه چی آماده س برای شروع، فقط قبلش یه دایرکتوری برای Entity هامون درست میکنیم که همینجوری توی دایرکتوری app  ول نباشن، من دایرکتوری app/Entities  رو دست کردم و بعدش توی فایل config/doctrine.php ، توی خط ۳۲، base_path('app')  رو به base_path('app/Entities')  تغییر دادم.

ایجاد Entity

برای مثال من میخوام Entity کاربر درست کنم، برای این منظور، یه فایل به نام User.php توی دایرکتوری app/Entities درست میکنم و Mappingشو به صورت Annotation بهش میدم. توی داکترین به چند شکل میشه Mapping تعریف کرد، Annotation , XML, YAML , PHP که به صورت پیشفرض من از Annotation استفاده  کردم. هر User من میتونه بینهایت BlogPost داشته باشه که اونو هم داخل کلاس نوشتم. توجه داشته باشید که هر Entity میتونه مستقیم یه  جدول از دیتابیس باشه یا نباشه.

در ادامه کلاس BlogPost رو هم ایجاد میکنم:

تا اینجای کار، ما فقط دو تا کلاس ساده PHP ایجاد کردیم و با دیتابیس کاری نداشتیم حالا برای ایجاد جداول دیتابیسمون یا اعمال تغییرات باید دستور زیر رو توی خط-فرمان اجرا کنیم:

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

 

کار با Entity ها

در Doctrine برای کار با Entity ها ما به طور پیشفرض با چند ابزار مواجه هستیم، Entity Manager, Entity Repository و Query Builder. که به وسیله Entity Manager همه عملیات‌ رو روی Entity  انجام میدیم. Entity Manager ابزارهای لازم برای کوئری گرفتن از دیتابیس و ایجاد و ویرایش بر روی دیتابیس رو بر عهده داره. در ادامه یه مثال میزنم که خوب متوجه بشید:
برای ایجاد یک کاربر و یه سری بلاگ‌پست کد زیر رو مینویسیم:

همونطور که میبینید، تو کد بالا با Entity ها مثل Objectهای معمولی PHP رفتار کردیم و دقیقا هم کار و رفتارشون  همینه و عملیات ارتباط با دیتابیس و ذخیره کردن و تبدیل محتوای آبجکت‌ها توسط EntityManager مدیریت میشه.

حالا برای دریافت اطلاعات از دیتابیس باید از Repository یا Query Builder استفاده کنیم. هر Entity میتونه Repository مخصوص به خودشو داشته باشه یا اینکه از EntityRepository پیشفرض Doctrine استفاده میکنیم. در هر صورت کاری که باید بکنیم اینه:

متغیر $manager رو از Container باید بگیریم که یا باید کلاس EntityManager رو inject کنیم تو متد یا کنترلرمون یا اینکه باید از به وسیله app('em')  یا app(EntityManager::calss)  میتونیم همه جا داشته باشیمش.

توصیه میکنم برای آشنایی بیشتر مستندات Doctrine ORM رو بخونید. در آخر اگه سوالی داشتید و میتونستم جواب بدم، خوشحال میشم کمکتون کنم.

 

 

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

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

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ها برای اینکه کد کمتری بنویسیم کاربرد بیشتری داره.

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

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

سلام

اگر طراح وب بوده باشید قطعا با این مشکل دست به گریبان بوده‌اید که حجم تصاویری که می‌خواهید در صفحه وبتان استفاده کنید بسیار زیاد است و این به خودی خود باعث کندی بارگذاری صفحه وب همچنین کاهش بازدید وب سایتتان خواهد بود. خب برای این کار چندین راه حل وجود دارد، ساده‌ترین راه حل و البته مشکل‌ترینشون اینه که تمام عکس‌ها را به سایزهای مختلف 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 کنید، اونم با این دستور:

موفق باشید.

تنظیمات دیتابیس برای تست در لاراول

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

خب برای این کار تو لاراول باید یه سری تنظیمات انجام بدیم که خیلی راحته. اگر دایرکتوری config رو توی پروژه‌تون نگاه کنید میبینید که شامل چند تا زیر دایرکتوریه که یکیش به نام testing ـه. تو این فولدر ما تنظیماتی رو قرار میدیم که در هنگام اجرای تست‌ها به کمکمون میاد و محیط تست این تنظیمات رو در اولویت استفاده قرار میده. به طور پیشفرض یک فایل app.php و یک فایل database.php قرار داره توش.

من برای تست از دیتابیس sqlite استفاده می‌کنم. پس محتویات فایل دیتابیس رو به این شکل تغییر میدیم:

 

اگه توجه کنید میبینید که تو قسمت آدرس فایل دیتابیس نوشتیم :memory: یعنی اینکه این دیتابیس به صورت فیزیکی در جایی وجود نداره و فقط هنگام اجرای تست‌ها در حافظه ساخته میشه و پس از پایان تست دیگه اثری ازش وجود نداره.

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

 

متد setUp در هنگام اجرای تست فراخوانی میشه و توش میایم و به وسیله کلاس Artisan دستور migrate رو اجرا می‌کنیم تا جداول دیتابیسمون ساخته بشن.

متد tearDown هم پس از پایان تست‌ها فراخوانی میشه و ما میاییم همه چیو تو دیبابیس به حالت اولش برمی‌گردونیم توسط دستور migrate:rollback.

حالا به راحتی می‌تونید تست‌هاتونو بنویسید و با دیتابیس واقعی سر و کله بزنید.

تذکر

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

بعد از این دستور sqlite برای php5 نصب شده و فعال می‌شود.

 

آشنایی با توابع 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 قابل دسترسیه ولی من خودم دوست دارم از نسخه پایدار استفاده کنم، پس منتظر می‌مونم.