راه اندازی یک پکیج لاراولی با Composer

در مقاله قبلی در مورد اهمیت و ضرورت کار با کتابخانه‌ها برای توسعه‌دهندگان توضیحاتی دادیم. در در ادامه می‌خواهیم بصورت کاملا عملیاتی و گام به گام یک بسته لاراولی رو توسعه بدیم. اما در این مقاله مواردی که پیش‌نیاز این کار هستند و نحوه‌ راه‌اندازی و کانفیگ اولیه توسط ابزار مدیریت بسته‌های php به نام composer رو آموزش خواهم داد. درصورتی که composer رو هم نصب ندارید در مقاله زیر نحوه نصب رو توضیح دادم که می‌تونید آنرا مطالعه کنید.

در انتهای این آموزش هم فرآیند تست کردن بسته رو خواهم گفت که با استفاده از یک بسته کمکی انجام میشه!


بیایید شروع کنیم:

در قدم اول باید یک نام برای بسته خودتون انتخاب کنید. معمولا از ساختار kebab برای انتخاب نام پکیج استفاده میشه. اگر با ساختار انتخاب نام‌ها آشنا نیستید پیشنهاد میدم مقاله زیر رو مطالعه کنید:

برای انتخاب نام‌ها خب همانطور که گفتیم من پروژمون از grabber استفاده کردم. پس در قدم اول یک دایرکتوری با همین نام ایجاد می‌کنم:

mkdir grabber
cd grabber

در ادامه همانطور که با دستور git init برای یک پروژه گیت رو راه‌اندازی می‌کردید در اینجا هم با composer برای تولید فایل تنظیمات اولیه composer.json از دستور مشابهی استفاده می‌کنیم:

composer init

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

Image for post
Image for post

حالا اگه داخل دایرکتوری خودتون رو نگاه کنید خواهید دید که یک فایل json به نام composer ایجاد شده. 

در ادامه برای تست گرفتن نیاز به یک بسته داریم که مشابه همون فرآیند توسعه مبتنی بر تست TDD رو در اینجا برای ما پیاده‌سازی می‌کنه! چنانچه با فرآیند توسعه TDD آشنایی ندارید می‌توانید به مقالاتی که در دوره آموزشی TDD منتشر کردم مراجعه کنید:

خب بسته مربوط به تست رو با دستور زیر نصب می‌کنیم:

composer require --dev orchestra/testbench

در حال حاضر که این مقاله رو می‌نویسم نسخه 6.23 این بسته منتشر شده. پس از اجرای دستور فوق خواهید دید کلی بسته دیگه هم نصب میشن. که البته بعضی از اونا برامون آشنان مثه بسته لاراول و یا بسته‌های symfony و بسته‌ phpunit که اگر خاطرتون باشه ما برای تست از اون استفاده می‌کردیم.

خب حالا میریم سراغ ساختار دایرکتوری داخل بستمون که یکی از موضوعاتی هست که میتونه پیچیده بشه! علتش هم اینه که قاعده مشخصی برای اینکه شما چطور سورس‌کدهاتون رو مرتب کنید! اما یک رویکرد وجود داره و اونم استفاده از همان ساختاری هست که در پکیج‌های لاراول وجود داره! بیایید به ساختاری که در گیت فریم‌ورک لاراول وجود داره نگاهی بیاندازیم:

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

ما در این دوره آموزشی و در بسته‌ای که توسعه می‌دهیم دقیقا می‌خواهیم از این ساختار استفاده کنیم بجز فولدر app که بجای اون از srcاستفاده خواهیم کرد که مسیر اصلی سورس کدهامون را شامل میشه. به نظر میرسه تمام افرادی هم که در جامعه توسعه‌دهندگان بسته‌های لاراولی کار می‌کنند با این ساختار موافق باشند!

خب با توجه به توضیحاتی که داده شد به پروژمون برمی‌گردیم و چندتا دایرکتوری ایجاد می‌کنیم:

mkdir src
mkdir tests
mkdir tests/Feature
mkdir tests/Unit

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

در قدم بعدی میریم سراغ تعریف  ‍‍autoload در تنظیمات composer.json

اگه بخواهم توضیح بدم که این کار یعنی چی و چرا باید تنظیم بشه! بیایید ابتدا به این فایل که مربوط به وردپرس هست نگاهی بیاندازید. همانطور که مشاهده می‌کنید در زبان PHP اگر بخواهیم در یک کلاس از ويژگی‌های کلاس دیگری استفاده کنیم بصورت خام باید از کلید‌های include و یا require‍‍ استفاده کنیم. که اینکار زمانیکه حجم کلاس‌ها زیاد میشه کار طاقت‌فرساییه و امکان خطا رو بالا میبره! 

براین‌اساس روشی به نام autoloading برای کمک به توسعه‌دهندگان ایجاد شده که بدون نوشتن دستورات اضافی بصورت خودکار عملیات include کردن کلاس‌ها و اشیا PHP انجام میشه!‌ به طور حتم زمانیکه روشی ابداع میشه یکسری استاندارد هم نیاز که به لطف تیم ‍PHP-FIG و استاندارد PSR-4  (مخفف PHP Standards Recommendations) که تعریف کرده اینکار انجام میشه. برای مطالعه نحوه عملکرد این استاندارد در composer هم مقاله زیر رو پیشنهاد می‌کنم:

برای این منظور من در انتهای تنظیمات composer.json دوتا قسمت برای autoloading مانند زیر اضافه می‌کنم:

"autoload": {
    "psr-4": {
       "codefarm\\Grabber\\": "src/"
     }
},
"autoload-dev": {
    "psr-4": {
       "codefarm\\Grabber\\Tests\\": "tests/"
    }
}

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

در ادامه برای افزودن قابلیت تست نوشتن به بستمون لازم داریم یه فایل xml که phpunit برای اجرا به اون نیاز داره رو داشته باشیم. این فایل بصورت پیش‌فرض درون هر پروژه لاراول وجود داره که در اینجا هم دقیقا همون فایل رو در دایرکتوری اصلیمون قرار می‌دهیم. اگر آموزش‌ها رو دنبال کرده باشید با این ساختار آشنایی دارید من در زیر کد این فایل قرار دادم:

تنها تغییر تعریف دایرکتوری src/. و حذف قسمت php  هست که در واقع برای لاراول هست و اینجا به آن نیاز نداریم. حالا خواهید دید که اگر دستور  phpunit رو در ترمینالتون وارد کنید همه‌چیز بدرستی کار می‌کند و خروجی مشابه زیر خواهد بود:

Image for post
Image for post

خب حالا بیایید اولین کلاس تستمون رو ایجاد کنیم اینجا خبری از artisan نیست پس برای اینکار کافیه یک فایل php داخل tests/Feature/. ایجاد و بصورت زیر کلاس رو تعریف کنید:

Image for post
Image for post

در اینجا با توجه به بسته تستی ‍Orchestra\Testbench که در ابتدا نصب شد هر کلاس تستی که ایجاد می‌کنیم باید از TestCase این بسته ارث بری کنه تا به کلاس‌های کمکی برای تست نوشتن دسترسی داشته باشیم.

اجازه بدید یکبار دیگه به همینجا namespace و عملکرد autoload که در composer.json تعریف کردیم، اشاره کنم. فرض کنید این قابلیت وجود نداشت در اینصورت فکر می‌کنید چطور باید TestCase رو داخل کلاس تستمون وارد می‌کردیم. احتمالا باید کل مسیر دسترسی تا اون کلاس رو بنویسید خب در اینصورت سیستم به سیستم باید مسیردهی رو اصلاح کنید و یا احتمالا هر توسعه‌دهنده‌ای برای خودش یکسری استاندارد تعریف می‌کرد و در اینصورت تصور کنید چه مصیبتی می‌کشیدم اگه قرار بود داخل پروژهمون چندین بسته رو داشته باشیم! 

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

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

Image for post
Image for post

خب در این مقاله با نحوه کانفیگ کردن و تنظیمات اولیه بسته‌های لاراولی آشنا شدید. در مقاله بعدی سراغ به پیاده‌سازی بسته‌مورد نظرمون خواهیم کرد و به مرور آنرا تکمیل می‌کنیم و نکاتی که در توسعه یک کتابخانه نیاز داریم رو خواهم گفت!

 

در صورتی که آموزش برایتان مفید بود لطفا 👏 و مقاله رو به اشتراک بگذارید!