استفاده از 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 رو بخونید. در آخر اگه سوالی داشتید و میتونستم جواب بدم، خوشحال میشم کمکتون کنم.

 

 

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

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

 

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

سلام

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

موفق باشید.

داکیومنت همه زبان‌ها و کتابخونه‌ها را یه جا داشته باشید!

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

devdocs.io

این ابزار فوق‌العاده DevDocs نام داره. وب‌اپلیکیشن بسیار کاربردی و مفیدی که روزبه‌روز داره کامل‌تر میشه و چیزای بیشتری بهش داره اضافه می‌شه. الان که دارم این پستو می‌نویسم، ۴۸ تا زبان و کتابخونه و فریمورک رو پشتیبانی می کنه که همشونم پراستفاده و معروفن. برای نمونه مثلن داکیومنت زبان‌های C, C++, JavaScript, PHP, Ruby, Python, go و  فریمورک‌های Laravel, AngularJs, BackboneJs, EmberJs, Django, jQuery, Yii و  ابزارهای دیگه مثل NodeJs, nginx, momentJs, lo-dash, Underscore, CSS, HTML, DOM و بسیاری دیگه از ابزارها که روزانه ازشون توی کدنویسی و توسعه استفاده می‌کنیم رو شامل میشه.

شما می تونید داکیومنت‌هایی رو که لارم دارین از لیست انتخاب کنید تا همیشه در دسترستون باشند حتی وقتی آفلاین هستید!. بهتره از سخن کم کنیم و بریم یه سری به DevDocs بزنیم.