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

پکیج‌ها در فریم‌ورک لاراولبه عنوان یک توسعه دهنده PHP، شما ممکن است کارکردن با فریم‌ورک ها را ترجیح دهید. فریم‌ورک ها در کنار کارآیی های بی‌شماری که دارند، با ساده‌ سازی شیوه‌ های رایج مورد استفاده در اکثر پروژه های توسعه وب مثل پکیج‌ ها، ماژول ها، پلاگین ها و حتی کامپوننت‌ ها، سعی می‌کنند فرایند توسعه را آسان‌تر کنند.شاید در طول فرایند توسعه، این احساس به شما دست دهد که دارید از نو چرخ را اختراع می‌کنید. برای مثال هنگامی که اپلیکیشنی برای احراز هویت کاربران و یا اعتبارسنجی کاربران می‌نویسید. این ها جز بخش هایی هستند که تقریبا در بیشتر پروژه های وب کاربرد دارند; در این صورت ما نیاز داریم یک پکیج بسازیم تا بتوانیم توسعه برنامه را سریع‌تر و راحت‌تر پیش ببریم و در پروژه های آینده از آن استفاده کنیم.داستان این نوشته از جایی شروع شد که در یکی از پروژه‌ های کاری، مدیر پروژه از من خواست قابلیتی به سیستم اضافه کنم; که کاربران بتوانند مقالات نوشته شده رو لایک کنند. کار ساده‌ای بود، با ایجاد یک مایگریشن و جدول در دیتابیس و یک مدل و یک رابطه بین جداول به سادگی این قابلیت به پروژه لاراولی ما اضافه شد. مدتی بعد که بخش ویدیوهای پروژه راه‌اندازی شد، به این نتیجه رسیدیم که قابلیت لایک کردن را باید در این بخش هم پیاده‌سازی کنیم. پس روشی که قبلا برای انجام این کار استفاده میکردیم، باید تغییر می‌کرد. ما در کدمون رفرنس های زیادی به فیلد post_id در جدول likes داشتیم. پس با بهره گیری از روابط چندریختی (Polymorphism) سیستمی دینامیک‌تر طراحی کردیم که محدود به یک جدول نباشد و همین سیستم در نهایت به یک پکیج لاراولی تبدیل شد که به راحتی از طریق کامپوزر قابل نصبه. در این نوشته به تشریح مراحل ساخت آن می‌پردازیم. فهرست مطالبی که در این نوشته مرور خواهیم کرد: نصب لاراولساختار فولدر‌ هافایل کامپوزربارگذاری پکیج در فایل اصلی کامپوزرساخت یک Service Provider برای پکیجساخت فایل مایگریشنساخت مدل برای جدول‌های دیتابیسبه‌ روز رسانی Service Provider برای بارگذاری پکیجبه‌ روز رسانی فایل کامپوزرانتشار پکیج در سرویس Packagist.org (ریپازیتوری اصلی کامپوزر)نصب پکیج و استفاده از متدهای آن‌نتیجه گیری نصب لاراولاز آن جا که پکیج‌ها برای افزودن قابلیت‌های جدید به هسته لاراول به کار می‌روند، اولین کاری که باید انجام دهیم ایجاد یک پروژه لاراولی است. ما نصب لاراول را از طریق کامپوزر (Composer) انجام می‌دهیم.نصب لاراول با کامپوزربرای سایر روش‌های نصب می‌توانید به مستندات رسمی لاراول مراجعه کنید. مستندات دقیق لاراول سایر گزینه های نصب را نیز به خوبی پوشش داده است. ساختار فولدر‌ هاپکیج ها باید دارای ساختار فولدر خاصی باشند . برای به وجود آوردن این ساختار می‌توان از ابزارهای کامندلاین مثل Laravel-Packager استفاده کرد. ما فایل ها و پوشه ها را به صورت دستی ایجاد می کنیم تا درک بهتری از چگونگی قرار گرفتن قطعات در کنار هم، داشته باشیم. داخل فولدر اصلی پروژه لاراول، فولدرهای زیر را به وجود بیاورید. ساختار فولدر‌ هاوِندور نیم vendorName : می‌تواند نام شما باشد یا نام مشتری و یا سازمانی که شما پکیج را برای آن می‌سازید.پکیج نیم packageName : مورد واضحیه. اسمی که می‌خواهید روی پکیج بگذارید.packages/AliBayat/Likeableمن در اینجا نام وِندور رو AliBayat و نام پکیج رو Likeable قرار دادم. حالا نیاز داریم تا یک فولدر src در داخل فولدر پکیج بسازیم تا فایل‌های مربوط به پکیج رو اونجا ذخیره کنیم. پس تا به اینجا فولدرها باید به چنین ترتیبی ساخته شده باشند:ساختار کامل فولدر‌ هافایل کامپوزر هر پکیج باید یک فایل "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ساخت فایل مایگریشنارتباط با دیتابیس و ذخیره و دریافت اطلاعات جز مجموعه عملیات هاییست که تقریبا در بیشتر پکیج ها مورد استفاده قرار می‌گیره. ابتدا داخل فولدر src فولدری به نام migrations بسازید. سپس در فولدر اصلی پروژه لاراولی دستور زیر رو در ترمینال وارد کنید:فایل مایگریشنحالا فایل مایگریشن به وجود آمده رو ویرایش می‌کنیم و با کد زیر ستون‌ها رو به جداولمون اضافه می‌کنیم. (این پکیج به ۲ جدول نیاز دارد که ما در اینجا هر دو را در قالب یک فایل مایگریشن پیاده سازی می‌کنیم)جدول های دیتابیسحال نیاز داریم تا مایگریشن رو اجرا کنیم. اما پیش از آن، لاراول نیاز دارد بداند که این فایل مایگریشن که برای پکیج ساختیم را چگونه بارگذاری کند. پس فایل سرویس پروایدر پکیج را باز کرده و کد زیر را به متد boot این فایل اضافه کنید.متد boot در سرویس پروایدر پکیجحال می‌توانیم با اجرای کد زیر در فولدر اصلی لاراول، جدول‌های دیتابیس مورد نظر را بسازیم. (وقتی پکیج کامل شود و روی ریپازیتوری کامپوزر قرار بگیرد این مرحله خود به خود صورت می‌گیرد)اجرای مایگریشن هاساخت مدل برای جدول‌های دیتابیسبعد از آنکه مایگریشن ها را به وجود آوردیم، برای جدول‌ ها مدل‌های الکوئنت می‌سازیم تا بتوانیم از متد‌های الکوئنت برای ایجاد، به روزرسانی و حذف اطلاعات در جداول استفاده کنیم. ساخت مدل هاحال فایل های Like.php و LikeCounter.php را که در فولدر app پروژه لاراولی قرار دارند را، به فولدر src پکیج انتقال دهید. و فراموش نکنید که نِیم اسپیس رو هم به نِیم اسپیس پکیج تغییر دهید. در اینجا AliBayat\Likeable . حال می‌توانیم کدهای مدل ها را طبق زیر اضافه کنیم:مدل Likeو مدل LikeCounter به شکل زیر:مدل LikeCounterدر واقع کدهای اصلی ما برای این پکیج درون یک Trait قرار می‌گیرند و در نتیجه ما می‌توانیم به راحتی این تِرِیت رو به هر مدلی که خواستیم، اضافه کنیم و قابلیت‌هاش رو در اون مدل استفاده کنیم. و ساخت ۲ مدل بالا در اینجا برای استفاده از روابط بین جدول ها در الکوئنت می‌باشد.در این نوشته با محتویات تِرِیت کاری نداریم، اما سعی می‌کنم در مطلبی جدا به عملکرد ها و قابلیت های این قسمت هم بپردازم. اما چنانچه شما علاقه به دیدن کد ها دارید، همیشه می‌توانید در ریپازیتوری گیت هاب پکیج فایل‌ها رو مورد بررسی قرار بدهید. به‌ روز رسانی Service Provider برای بارگذاری پکیجپکیج ما با توجه به نوع عملکردش، احتیاجی به کنترلر، فایل های ویوی بلِید و یا Route نداشت. اما وجود این قسمت ها در بسیاری از پکیج ها ضروری هست. پس به توضیحی کوتاه درباره نحوه بارگذاری این فایل‌ ها توسط لاراول می‌پردازیم.تمام مراحل بارگذاری و همچنین عملیات هایی مثل انتشار فایل‌های config & view ، در قلب پکیج ما یعنی داخل سرویس پروایدر صورت می‌گیرند. برای افزودن این موارد بصورت زیر عمل می‌کنیم:نحوه بارگذاری موارد مختلف در سرویس پروایدراکنون می‌توانید فایل های پکیج را توسط ابزار کامند لاین artisan منتشر کنید:انتشار فایل های پکیج به‌ روز رسانی فایل کامپوزرپکیج ما برای عملکرد، ممکن است به پکیج‌های دیگری نیاز داشته باشد. و یا حتی شامل پیش نیازهایی باشد. اگر می‌خواهیم پکیج ما با نسخه خاصی از PHP کار کند و یا پکیج‌های خاصی را به عنوان پیش‌نیاز معرفی کنیم، فایل composer.json پکیج ما و شئ require آن دقیقا جایی است که این گونه موارد را باید اضافه کنیم. در نهایت فایل composer.json ما باید شبیه به زیر باشد.فایل compose.json در پایانهمچنین می توانیم شئ extra را هم به "composer.json" اضافه کنیم که پکیج ما را بارگذاری می‌کند; و دیگر نیازی نیست آدرس سرویس پروایدر پکیج را به آرایه providers در فایل "config/app.php" اضافه کنیم.. و پکیج ما به صورت خودکار شناسایی می‌شود. این قابلیت تحت عنوان package auto-discovery از نسخه ۵.۵ به هسته لاراول افزوده شد.انتشار پکیج در سرویس Packagist.org (ریپازیتوری اصلی کامپوزر)به عنوان قدم نهایی ما پکیج رو در گیت هاب و سپس در پکیجیست ثبت می‌کنیم و در نتیجه بعد از آن قادر خواهیم بود، این پکیج را از طریق کامند composer به راحتی نصب کنیم.سری به گیت هاب بزنید و یک ریپازیتوری جدید بسازید. لینک ریپازیتوری که ساختید رو کپی کنید، سپس به فولدر اصلی پکیج رفته و دستور زیر را در ترمینال وارد کنید:ریپازیتوری ریموتسپس فایل ها را اضافه کرده و کامیت می‌کنیم:افزودن فایل‌ها و کامیتو در نهایت فایل ها را پوش کرده یا به ریپازیتوری ارسال میکنیم.ارسال به برنچ masterما در این بخش از دستورات گیت استفاده کردیم، اما اگر شما به گیت دسترسی ندارید و یا حتی دوست ندارید از طریق ترمینال کار کنید; می‌توانید در سایت گیت هاب هم این عملیات ها رو انجام بدید.حالا به سایت پکیجیست (Packagist.org) رفته، و لینک ریپازیتوری گیت هاب پکیج را ثبت کنید و تمام.نصب پکیج و استفاده از متدهای آن‌در این مرحله به راحتی می‌توانید پکیچ منتشر شده را هر زمان که خواستید با کامپوزر نصب کنید و استفاده کنید:نصب پکیج Likeableسپس مایگریشن‌ها را اجرا کنید:اجرای مایگریشن‌هابرای آماده سازی مدل، فقط باید از تِرِیت پکیج داخل مدل مورد نظر استفاده کنید:آماده سازی مدلبه همین سادگی ما قابلیت لایک شدن رو به مدل Post اضافه کردیم. با این کار یک سری متد ها که مربوط به این قابیلت(لایک شدن) هستند به مدل ما اضافه میشه; که در تصویر زیر بهشون اشاره شده:لیست متدهای پکیج Likeableنتیجه گیری این پکیج به گونه ای طراحی شده تا بتونه با مدل‌های الکوئنت در ارتباط باشه و قابلیت لایک شدن رو هر جا که خواستیم به مدلمون اضافه کنه. و این سبک پیاده سازی به حل مشکلی که در ابتدای نوشته بهش اشاره کردم، کمک بسیاری می‌کند. سورس این پروژه روی گیت‌هاب موجود هست.https://github.com/AliBayat/Laravel-Likeableو در پایان: ما در این نوشته ساخت یک پکیج نسبتا ساده را برای فریم‌ورک لاراول و انتشار آن روی سرویس پکیجیست را بررسی کردیم، اما موارد (پکیج‌های) بسیار جذاب دیگری وجود دارند که می توانید با استفاده از این دانش جدید بسازید.