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

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

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

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

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

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

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

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

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

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

منابعی برای یادگیری زبان‌برنامه‌نویسی Scala

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

منابع آنلاین:

– Functional Programming Principles in Scala : یک دوره آموزشی توی coursera

– Ninety-Nine Scala Problems:  نود و نه مساله که بیشترشون الگوریتمیکه برای یادگیری اسکالا

– Scala Best Practices : خب از اسمش معلومه، روش‌های درست برنامه‌نویسی با Scala رو یاد می‌گیرید.

Scala School:  محلی برای یادگیری اسکالا که توسط توییتر ایجاد شده

– Effective Scala : اینم یه سایت دیگه که بازم توسط توییتر پشتیبانی میشه. همونطور که میدونید توییتر با زبان اسکالا توسعه داده میشه.

A Tour of Scala : یه سایت برای یادگیری interactive زبان‌ برنامه‌نوسی اسکالا که مرحله به مرحله با نوشتن کد بهتون scala رو یاد میده.

Stackoverflow: اینم لیست مباحث و ویکی‌هایی که توسط کاربران stackoverflow ایجاد شده

A Scala Tutorial for Java Programmers: آموزش‌هایی برای برنامه‌نویسان جاوا که قصد مهاجرت به اسکالا رو دارند.

Scala Tour : یک منبع دیگه که باز هم به صورت interactive و مرحله به مرحله آموزش میده.

 

کتاب‌های آموزشی:

– Scala for the Impatient

 Programming in Scala: A Comprehensive Step-by-Step Guide : کتابی که خیلی خودندنش سفارش شده.

– Scala in Depth

Scala by example

 

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

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

 

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

 

آموزش نصب اسکالا در اوبونتو ۱۴٫۰۴

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

Scala را به چند روش میشه نصب کرد که من تو این آموزش روش نصب به وسیله فایل‌های کامپایل‌ شده (باینری) رو میخوام توضیح بدم. برای نصب ابتدا به این آدرس رفته و فایل فشرده حاوی فایل های زبان برنامه‌نویسی اسکالا رو دانلود می‌کنیم: به شکل زیر:

download scala lang bineries

 

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

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

 

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

سلام

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

موفق باشید.