الگوی طراحی ریپازیتوری برای پکیج های لاراول – راهنمای کاربردی

۲۱۴ بازدید
آخرین به‌روزرسانی: ۱۵ مهر ۱۴۰۲
زمان مطالعه: ۶ دقیقه
دانلود PDF مقاله
الگوی طراحی ریپازیتوری برای پکیج های لاراول – راهنمای کاربردیالگوی طراحی ریپازیتوری برای پکیج های لاراول – راهنمای کاربردی

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

997696

بدین ترتیب در پروژه‌های جدید می‌توان دقیقاً از همان کد ریپازیتوری قبلی استفاده کرد. همزمان مسئله کپی کردن و چسباندن کد بین پروژه‌ها نیز منتفی خواهد بود. راه‌حل این است که کد ریپازیتوری را به پکیج لاراول خودش منتقل کنیم. در ادامه با بهره‌گیری از کامپوزر و همچنین منطق بارگذاری خودکار می‌توانیم کلاس‌های خود را در پروژه بارگذاری کرده و به دستور 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 را بازیابی کرده‌ایم:

الگوی طراحی ریپازیتوری

سخن پایانی

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

اگر این نوشته برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
swlh
دانلود PDF مقاله
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *