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

 

 

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

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

موفق باشید.

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

مروری بر سالی که گذشت

تو یه سالی که گذشت تونستم درسمو تموم کنم و لیسانسو بگیرم. بعدش با دوستام شرکت پیشتازان فناوری اسپانتا رو راه انداختیم که به نظرم ریسک بسیار بالایی بود و جرات میخواست که به حمدلله توفیق حاصل شد تا بتونیم سرپا نگهش داریم. اوایلش یه خورده سخت بود، چون چندتا جوون کم تجربه تو زمینه شرکت داری و بازار و این حرفا بودیم که میخواستیم خودمونو تو این بازار جا بدیم.
از کمبود مشتری بگیر تا اختلاف سلیقه های جزئی و کلی بین بچه‌ها، هزینه‎های نگهداری شرکت و خلاصه خیلی چیزایی دیگه. تو وسط راه 4 نفر از بچه‌ها کنار کشیدن و یکی دوتا دیگه اضافه شدن. الان که آخر ساله از وضعیت تقریبن راضیم، از حد انتظارم فراتر بودیم ولی میشد که خیلی بهتر از اینا باشیم که اونم وابسته به عوامل متعدد دیگه‌س.
از زمینه شغلی بگذریم تو زمینه فنی هم به نظرم سال خیلی خوبی بود. پارسال این موقع ها بود که شروع کرده بودم به کار با فریمورک Codeigniter که یه 6 ماهی باهاش کار کردم و ازش راضی بودم. شرکتو که زدیم تصمیم بر این شد که یه فریمورک اختصاصی برای خودمون بنویسیم و بعد یکی دو ماه یه دونه نوشتیم اسمشم گذاشتیم ژیکس(یکی از نام های قدیمی ایرانی بود). به چند تا پروژه باهاش جلو بردیم ، میتونست جای کدایگنایترو برام بگیره و خیلی کمبود داشت و وقت اینکه بهبودش بدیم و براش کتابخونه بنویسیم نداشتیم، تا اینکه زد و با لاراول آشنا شدم، خیلی خوب بود، اصن عالی بود، همون چیزی بود که من میخواستم. یه جورایی یه انقلابی تو زمینه php و وب محسوب میشه.معماریش، کدنویسیش، اصن همه چی  منظم و کاربردی و کول.
الان حدود 2-3 ماهی میشه که با این فریمورک کار میکنم و تقریبن روزی نیس که یه چیز جدید راجع بهش یاد نگیرم، هر روز سراغ package هایی که دیگران نوشتن و به اشتراک میذارن میرم و خوباشونو سوا میکنم تا تو فرصت بهتر بررسیشون کنم. البته بگم تمام این قدرت لاراول از composer سرچشمه میگیره که واقعن عالیه.
به غیر از کار برنامه نویسی کارای دیگه بر حسب ضرورت و نیاز انجام دادم و برام تجربه و آموزش خیلی خوبی بوده. که میشه از نصب دوربین مداربسته ، راه اندازی شبکه و از همه جالبترش هم یه سیستم viop بود که این یکی دیگه آخرش بود، نام برد. از این جهت گفتم جالب که کارو گرفته بودیم، قرار بود یکی از دوستامون بیاد برای انجامش ولی یه سری مشکلات مثل عدم توافق نهایی با کارفرما و در دسترس نبودن اون دوستمون مجبور شدم بشینم دو ساعته اصلن ببینم چی هست و چه جوری کار میکنه و اینا رو یاد بگیرم و صبش رفتم سر کار با یه عالمه استرس ولی خداروشکر همه چیو راحت پیش بردم، هم به راحتی elastix نصب کردم (تا دو روز پیش نمیدونستم اصن چیه) و سیستم تلفنی یه آژانس هواپیماییو راه انداختیم که آخر سر که کار کرد واقعن خستگی از تنمون دراومد.
در آخر هم تونستم معافیتمو از نوع موارد خاص بگیرم و خودمو یه دو سالی جلو بندازم، یه سری از دوستام حسادت میکنن ولی بهشون حق میدم ، خب مننم بودم همین کارو میکردم.
امیدوارم سال دیگه سال خوبی برای همه باشه.و اینکه بتونم پروژه‌هامو به موقع تحویل بدم. 🙂