ساخت پکیج‌‌ها در فریم‌ورک لاراول

پکیج‌ها در فریم‌ورک لاراول
پکیج‌ها در فریم‌ورک لاراول

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

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

داستان این نوشته از جایی شروع شد که در یکی از پروژه‌ های کاری، مدیر پروژه از من خواست قابلیتی به سیستم اضافه کنم; که کاربران بتوانند مقالات نوشته شده رو لایک کنند. کار ساده‌ای بود، با ایجاد یک مایگریشن و جدول در دیتابیس و یک مدل و یک رابطه بین جداول به سادگی این قابلیت به پروژه لاراولی ما اضافه شد. مدتی بعد که بخش ویدیوهای پروژه راه‌اندازی شد، به این نتیجه رسیدیم که قابلیت لایک کردن را باید در این بخش هم پیاده‌سازی کنیم. پس روشی که قبلا برای انجام این کار استفاده میکردیم، باید تغییر می‌کرد. ما در کدمون رفرنس های زیادی به فیلد post_id در جدول likes داشتیم. پس با بهره گیری از روابط چندریختی (Polymorphism) سیستمی دینامیک‌تر طراحی کردیم که محدود به یک جدول نباشد و همین سیستم در نهایت به یک پکیج لاراولی تبدیل شد که به راحتی از طریق کامپوزر قابل نصبه. در این نوشته به تشریح مراحل ساخت آن می‌پردازیم.



فهرست مطالبی که در این نوشته مرور خواهیم کرد:

  1. نصب لاراول
  2. ساختار فولدر‌ ها
  3. فایل کامپوزر
  4. بارگذاری پکیج در فایل اصلی کامپوزر
  5. ساخت یک Service Provider برای پکیج
  6. ساخت فایل مایگریشن
  7. ساخت مدل برای جدول‌های دیتابیس
  8. به‌ روز رسانی Service Provider برای بارگذاری پکیج
  9. به‌ روز رسانی فایل کامپوزر
  10. انتشار پکیج در سرویس Packagist.org (ریپازیتوری اصلی کامپوزر)
  11. نصب پکیج و استفاده از متدهای آن‌
  12. نتیجه گیری

نصب لاراول

از آن جا که پکیج‌ها برای افزودن قابلیت‌های جدید به هسته لاراول به کار می‌روند، اولین کاری که باید انجام دهیم ایجاد یک پروژه لاراولی است. ما نصب لاراول را از طریق کامپوزر (Composer) انجام می‌دهیم.

نصب لاراول با کامپوزر
نصب لاراول با کامپوزر

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


ساختار فولدر‌ ها

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

داخل فولدر اصلی پروژه لاراول، فولدرهای زیر را به وجود بیاورید.

ساختار فولدر‌ ها
ساختار فولدر‌ ها
  • وِندور نیم vendorName : می‌تواند نام شما باشد یا نام مشتری و یا سازمانی که شما پکیج را برای آن می‌سازید.
  • پکیج نیم packageName : مورد واضحیه. اسمی که می‌خواهید روی پکیج بگذارید.
packages/AliBayat/Likeable
packages/AliBayat/Likeable

من در اینجا نام وِندور رو AliBayat و نام پکیج رو Likeable قرار دادم. حالا نیاز داریم تا یک فولدر src در داخل فولدر پکیج بسازیم تا فایل‌های مربوط به پکیج رو اونجا ذخیره کنیم. پس تا به اینجا فولدرها باید به چنین ترتیبی ساخته شده باشند:

ساختار کامل فولدر‌ ها
ساختار کامل فولدر‌ ها

فایل کامپوزر

هر پکیج باید یک فایل "composer.json" داشته باشد که حاوی تمام پکیج ها و وابستگی های آنها می‌باشد. برای ساخت این فایل در آدرس روت پکیج دستور زیر رو اجرا کنید:

ساخت فایل
ساخت فایل "composer.json"

از آنجایی که این یک دستور تعاملی است، کامپوزر چندین سوال می‌پرسد. دستورالعمل کامپوزر را دنبال کنید. اگر نمی‌دانید به سوالات چه پاسخی دهید، با فشردن کلید اینتر از مقادیر پیش‌فرض استفاده کنید. بعدا هم می‌توانید این اطلاعات را در فایل "composer.json" تغییر دهید. حالا فایل "composer.json" شما باید کم و بیش این‌گونه باشد:


بارگذاری پکیج در فایل اصلی کامپوزر

قبل از آنکه پکیج را به بارگذاری خودکار در لاراول اضافه کنیم، نیاز داریم تا یک قسمت دیگر به شئ موجود در فایل "composer.json" پکیج اضافه کنیم:

composer.json
composer.json

در این مرحله، فایل "composer.json" پکیج ما باید شبیه زیر باشد:

composer.json
composer.json


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

گیت
گیت


برای هر اپلیکیشن لاراول یک فایل "composer.json" در فولدر روت پروژه موجود است. لاراول باید بتواند فایل‌ های پکیج ما را autoload کرده یا به صورت خودکار بارگذاری کند. برای انجام این پروسه باید قسمتی (autoload > psr-4) از فایل "composer.json" اصلی، که در فولدر روت پروژه لاراولی قرار دارد، را ویرایش کنیم و نیم اِسپیس پکیج را اضافه کنیم.

فایل اصلی
فایل اصلی "composer.json"

پس از آن در فولدر روت پروژه لاراول، دستور زیر را در کامند لاین اجرا کنید تا تغییراتی که در بالا انجام دادیم، اعمال شوند:

کامند کامپوزر
کامند کامپوزر



ساخت یک Service Provider برای پکیج

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

در فولدر src پکیج فایلی به نام LikeableServiceProvider.php بسازید. همچنین میتوانید از artisan استفاده کنید و فایل را به این فولدر جا به جا کنید. داخل این سرویس پروایدر ما باید چند نکته را رعایت کنیم:

  • باید نیم اِسپیس رو به نیم اِسپیسی که برای پکیج تعریف کردیم، تغییر بدیم.
  • باید کلاس اصلی که سرویس پروایدرها ازش ارث‌بری می‌کنند، رو اضافه کنیم.
  • افزودن دو متد الزامی هر سرویس پروایدر (متدهای boot و register) به کلاسی که ساختیم.

حال سرویس پروایدر پکیج ما باید شبیه زیر باشد:

سرویس پروایدر پکیج
سرویس پروایدر پکیج

خیلی خوب، سرویس پروایدر رو ساختیم. تنها کاری که می‌مونه اضافه کردن این کلاس به قسمت providers آرایه موجود در فایل config/app.php هست.

config/app.php
config/app.php

ساخت فایل مایگریشن

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

فایل مایگریشن
فایل مایگریشن

حالا فایل مایگریشن به وجود آمده رو ویرایش می‌کنیم و با کد زیر ستون‌ها رو به جداولمون اضافه می‌کنیم. (این پکیج به ۲ جدول نیاز دارد که ما در اینجا هر دو را در قالب یک فایل مایگریشن پیاده سازی می‌کنیم)

جدول های دیتابیس
جدول های دیتابیس

حال نیاز داریم تا مایگریشن رو اجرا کنیم. اما پیش از آن، لاراول نیاز دارد بداند که این فایل مایگریشن که برای پکیج ساختیم را چگونه بارگذاری کند. پس فایل سرویس پروایدر پکیج را باز کرده و کد زیر را به متد boot این فایل اضافه کنید.

متد boot در سرویس پروایدر پکیج
متد boot در سرویس پروایدر پکیج

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

اجرای مایگریشن ها
اجرای مایگریشن ها

ساخت مدل برای جدول‌های دیتابیس

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

ساخت مدل ها
ساخت مدل ها

حال فایل های Like.php و LikeCounter.php را که در فولدر app پروژه لاراولی قرار دارند را، به فولدر src پکیج انتقال دهید. و فراموش نکنید که نِیم اسپیس رو هم به نِیم اسپیس پکیج تغییر دهید. در اینجا AliBayat\Likeable . حال می‌توانیم کدهای مدل ها را طبق زیر اضافه کنیم:

مدل Like
مدل Like

و مدل LikeCounter به شکل زیر:

مدل LikeCounter
مدل LikeCounter

در واقع کدهای اصلی ما برای این پکیج درون یک Trait قرار می‌گیرند و در نتیجه ما می‌توانیم به راحتی این تِرِیت رو به هر مدلی که خواستیم، اضافه کنیم و قابلیت‌هاش رو در اون مدل استفاده کنیم. و ساخت ۲ مدل بالا در اینجا برای استفاده از روابط بین جدول ها در الکوئنت می‌باشد.

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



به‌ روز رسانی Service Provider برای بارگذاری پکیج

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

تمام مراحل بارگذاری و همچنین عملیات هایی مثل انتشار فایل‌های config & view ، در قلب پکیج ما یعنی داخل سرویس پروایدر صورت می‌گیرند. برای افزودن این موارد بصورت زیر عمل می‌کنیم:

نحوه بارگذاری موارد مختلف در سرویس پروایدر
نحوه بارگذاری موارد مختلف در سرویس پروایدر

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

انتشار فایل های پکیج
انتشار فایل های پکیج



به‌ روز رسانی فایل کامپوزر

پکیج ما برای عملکرد، ممکن است به پکیج‌های دیگری نیاز داشته باشد. و یا حتی شامل پیش نیازهایی باشد. اگر می‌خواهیم پکیج ما با نسخه خاصی از PHP کار کند و یا پکیج‌های خاصی را به عنوان پیش‌نیاز معرفی کنیم، فایل composer.json پکیج ما و شئ require آن دقیقا جایی است که این گونه موارد را باید اضافه کنیم. در نهایت فایل composer.json ما باید شبیه به زیر باشد.

فایل compose.json در پایان
فایل compose.json در پایان

همچنین می توانیم شئ extra را هم به "composer.json" اضافه کنیم که پکیج ما را بارگذاری می‌کند; و دیگر نیازی نیست آدرس سرویس پروایدر پکیج را به آرایه providers در فایل "config/app.php" اضافه کنیم.. و پکیج ما به صورت خودکار شناسایی می‌شود. این قابلیت تحت عنوان package auto-discovery از نسخه ۵.۵ به هسته لاراول افزوده شد.



انتشار پکیج در سرویس Packagist.org (ریپازیتوری اصلی کامپوزر)

به عنوان قدم نهایی ما پکیج رو در گیت هاب و سپس در پکیجیست ثبت می‌کنیم و در نتیجه بعد از آن قادر خواهیم بود، این پکیج را از طریق کامند composer به راحتی نصب کنیم.

سری به گیت هاب بزنید و یک ریپازیتوری جدید بسازید. لینک ریپازیتوری که ساختید رو کپی کنید، سپس به فولدر اصلی پکیج رفته و دستور زیر را در ترمینال وارد کنید:

ریپازیتوری ریموت
ریپازیتوری ریموت

سپس فایل ها را اضافه کرده و کامیت می‌کنیم:

افزودن فایل‌ها و کامیت
افزودن فایل‌ها و کامیت

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

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

حالا به سایت پکیجیست (Packagist.org) رفته، و لینک ریپازیتوری گیت هاب پکیج را ثبت کنید و تمام.



نصب پکیج و استفاده از متدهای آن‌

در این مرحله به راحتی می‌توانید پکیچ منتشر شده را هر زمان که خواستید با کامپوزر نصب کنید و استفاده کنید:

نصب پکیج Likeable
نصب پکیج Likeable

سپس مایگریشن‌ها را اجرا کنید:

اجرای مایگریشن‌ها
اجرای مایگریشن‌ها

برای آماده سازی مدل، فقط باید از تِرِیت پکیج داخل مدل مورد نظر استفاده کنید:

آماده سازی مدل
آماده سازی مدل

به همین سادگی ما قابلیت لایک شدن رو به مدل Post اضافه کردیم. با این کار یک سری متد ها که مربوط به این قابیلت(لایک شدن) هستند به مدل ما اضافه میشه; که در تصویر زیر بهشون اشاره شده:

لیست متدهای پکیج Likeable
لیست متدهای پکیج Likeable

نتیجه گیری

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

https://github.com/AliBayat/Laravel-Likeable

و در پایان: ما در این نوشته ساخت یک پکیج نسبتا ساده را برای فریم‌ورک لاراول و انتشار آن روی سرویس پکیجیست را بررسی کردیم، اما موارد (پکیج‌های) بسیار جذاب دیگری وجود دارند که می توانید با استفاده از این دانش جدید بسازید.