الگوی طراحی ریپازیتوری برای پکیج های لاراول – راهنمای کاربردی
ایجاد یک پکیج لاراول روشی عالی برای جلوگیری از تکرار کردن کدها محسوب میشود. این مقصود در صورتی که از یک الگوی طراحی ریپازیتوری نیز بهره بگیرید بسیار بهینهتر خواهد بود و موجب میشود که کنترلرها منظم مانده و برای تست آماده باشند.
بدین ترتیب در پروژههای جدید میتوان دقیقاً از همان کد ریپازیتوری قبلی استفاده کرد. همزمان مسئله کپی کردن و چسباندن کد بین پروژهها نیز منتفی خواهد بود. راهحل این است که کد ریپازیتوری را به پکیج لاراول خودش منتقل کنیم. در ادامه با بهرهگیری از کامپوزر و همچنین منطق بارگذاری خودکار میتوانیم کلاسهای خود را در پروژه بارگذاری کرده و به دستور make:repository خود دسترسی پیدا کنیم.
ساختار پروژهای که میخواهیم داشته باشیم به صورت زیر است:
lazyelephpant/ repository/ src/ Console/ Command/ Stubs/
بدین ترتیب میتوان با اجرای دستور composer init به صورت تعاملی یک فایل composer.json ساخت.
با این حال، ما در این جا یک فایل composer.json قدیمی را از پروژه دیگری کپی کردهایم و مقادیر آن را تغییر دادهایم.
بارگذاری خودکار
نخستین گام مهم بحث «بارگذاری خودکار» (Autoloading) است.
کدهای مربوطه را در ادامه آوردهایم.
اگر با طرز کار جادویی بارگذاری خودکار آشنا نیستید باید بگوییم که کامپوزر یک autoloader به صورت PSR-4 برای فضای نام LazyElePHPant ثبت میکند که اساساً رشته LazyElePHPant را به src/folder نگاشت میکند.
در ادامه باید فایل autoload.php را در مسیر پوشه vendor/ مجدداً ایجاد بکنید. این کار از طریق اجرای دستور dump-autoload میسر است.
کشف پکیج لاراول
در لاراول میتوان پکیجهایی تنظیم کرد که فریمورکها با مراجعه به مسیر config/app.php آنها را کشف کرده و به آرایه provider-ها اضافه کنند. با این وجود، ما میخواهیم پکیجمان این کار را به صورت خودکار انجام دهد:
با تعیین مقدار RepositoryServiceProvider در بخش extras فایلِ composer.json میتوانیم کاری کنیم که لاراول ارائهدهنده سرویس را به صورت خودکار بارگذاری کند.
باید فایل RepositoryInterface و پیادهسازی Repository را در پوشه src/ قرار دهیم. این فایلها در حال حاضر از سوی پروژه جاری در حال استفاده هستند. آنها را در ادامه طوری ویرایش کردهایم که از درون پکیج لاراول نیز کار کنند.
فایل RepositoryInterface.php
فایل Repository.php
در این مرحله پوشه پکیج لاراول، ساختاری مانند زیر دارد:
lazyelephpant/ repository/ composer.json src/ RepositoryInterface.php Repository.php Console/ Command/ Stubs/
برای این که بدانید معنی stub چیست، باید به صورت عمیقتری این فریمورک را بررسی کنیم. در مستندات لاراول اشارههایی به stub وجود دارد، اما توضیح جامعی در مورد آنها ارائه نشد است. stub-ها برای اغلب کسانی که سروکار عمیقی با لاراول ندارند موضوع جدیدی محسوب میشوند و باید با فریمورک سروکله بزنید تا بفهمید که php artisan چگونه میتواند کنترلر و کلاسهای مدل را ایجاد کند. پاسخ این سؤال در stub نهفته است. اگر تاکنون از دستورهای زیر استفاده کرده باشید:
php artisan make:controller SomeController
یا
php artisan make:model SomeModel
میدانید که stub یک قالب است که این کلاسها بر مبنای آن ساخته شدهاند. ما با نگاه به طرز کار فریمورک، stub-های خودمان را ساختیم که به صورت زیر هستند:
فایل repository.plain.stub
Stub ساده، قالبی است که در زمان ساخت مدل تعیین میشود:
php artisan make:repository
با این حال اگر میخواهید یک مدل تعیین کنید، باید از قالبی به نام repository.stub استفاده کنید:
php artisan make:repository --model=User
فایل repository.stub
ایده کار این است که یک ریپازیتوری با مدل User تولید میکنیم:
دستور Repository
در نهایت به دستوری میرسیم که همه کارها را بر عهده دارد.
فایل RepositoryMakeCommand.php
اینک که میدانیم بخشهای مختلف چه هستند. ساختار پکیج به صورت زیر خواهد بود:
lazyelephpant/ repository/ composer.json src/ RepositoryInterface.php Repository.php Console/ Command/ RepositoryMakeCommand.php Stubs/ repository.stub repository.plain.stub
در این مرحله ساختار پکیج لاراول ما به صورت زیر است. تنها یک مشکل وجود دارد. مهمترین بخش را که کلاس RepositoryServiceProvider.php است، فراموش کردهایم.
ارائهدهنده سرویس پکیج لاراول
باید یک کلاس RepositoryServiceProvider.php را در پوشه src/ ایجاد کنیم. RepositoryServiceProvider باید کلاس ServiceProvider.php لاراول را بسط دهد.
در مستندات (+) نیز به روش دقیق ثبت دستور اشاره شده است:
اینک همه چیز تنظیم شده است و آماده تست هستیم. برای تست لوکال پکیج لاراول به فایل کامپوزر خود بازمیگردیم و یک مدخل برای الزام (required) آن اضافه میکنیم:
سپس دستور زیر را اجرا میکنیم تا پکیج دریافت شود:
composer update
اینک پکیج در پوشه vendor قرار گرفته است و میتوانیم بررسی کنیم آیا دستور کار میکند:
بدین ترتیب کلاس ریپازیتوری با موفقیت بدون مدل ساخته میشود:
اکنون بررسی میکنیم که امکان انتساب یک مدل را داریم یا نه:
در ادامه یک dump ساده را میبینید که نشان میدهد در عمل TestRepository را بازیابی کردهایم:
سخن پایانی
برخی از مخالفان برنامهنویسی شیءگرا استدلال میکنند که در نهایت وقتی لازم باشد از کدی در پروژه دیگر استفاده کنید، باید کد را به آن پروژه کپی کنید. امروزه اغلب زبانهای برنامهنویسی از نوعی سیستم مدیریت پکیج بهره میگیرند. به نظر میرسد که ضرورت ایجاد کتابخانههایی با قابلیت استفاده مجدد، اینک بیش از هر زمان دیگری حس میشود. اگر حس میکنید لازم است کدی را از پروژهای به پروژه دیگر کپی کنید، شاید بهتر باشد یک پکیج برای خود بسازید.
اگر این نوشته برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی PHP
- مجموعه آموزشهای برنامهنویسی
- آموزش REST API در Laravel (لاراول) با بسته Passport
- انتشار لاراول (Laravel Broadcasting) چگونه کار می کند؟ — راهنمای کاربردی
- ارسال ایمیل در لاراول (Laravel) — راهنمای کاربردی
==