قراردادها
معرفی
قراردادهای لاراول مجموعه ای از اینترفیس ها هستند که خدمات اصلی ارائه شده
توسط فریم ورک را تعریف می کنند.
به عنوان مثال، یک
Illuminate\Contracts\Queue\Queue
قرارداد روش های مورد نیاز برای صف بندی مشاغل را تعریف می کند، در حالی که
Illuminate\Contracts\Mail\Mailer
قرارداد روش های مورد نیاز برای ارسال ایمیل را تعریف می کند.
هر قرارداد دارای یک اجرای متناظر است که توسط چارچوب ارائه شده است. به عنوان مثال، لاراول یک اجرای صف با انواع درایورها و یک پیاده سازی پستی که توسط SwiftMailer ارائه می شود .
همه قراردادهای لاراول در مخزن GitHub خود زندگی می کنند . این یک نقطه مرجع سریع برای همه قراردادهای موجود، و همچنین یک بسته مجزا و جدا شده است که ممکن است توسط توسعه دهندگان بسته استفاده شود.
قراردادها در مقابل نماها
نماهای لاراول و توابع کمکی راه ساده ای برای استفاده از خدمات لاراول بدون نیاز به تایپ کردن و حل قراردادهای خارج از کانتینر خدمات ارائه می دهند. در بیشتر موارد، هر نما دارای قراردادی معادل است.
برخلاف نماها، که نیازی به نیاز به آنها در سازنده کلاس خود ندارند، قراردادها به شما امکان می دهند وابستگی های صریح را برای کلاس های خود تعریف کنید. برخی از توسعه دهندگان ترجیح می دهند وابستگی های خود را به این شکل به صراحت تعریف کنند و بنابراین ترجیح می دهند از قرارداد استفاده کنند، در حالی که توسعه دهندگان دیگر از راحتی نماها لذت می برند.
اکثر برنامه ها صرف نظر از اینکه نما یا قرارداد را ترجیح می دهید خوب خواهند بود. با این حال، اگر در حال ساخت یک بسته هستید، باید قویاً استفاده از قراردادها را در نظر بگیرید زیرا آزمایش آنها در یک زمینه بسته آسان تر خواهد بود.
زمان استفاده از قراردادها
همانطور که در جاهای دیگر بحث شد، بیشتر تصمیم برای استفاده از قراردادها یا نماها به سلیقه شخصی و سلیقه تیم توسعه شما بستگی دارد. هم قراردادها و هم نماها را می توان برای ایجاد برنامه های لاراول قوی و آزمایش شده استفاده کرد. تا زمانی که مسئولیت های کلاس خود را متمرکز نگه دارید، تفاوت های عملی بسیار کمی بین استفاده از قراردادها و نماها مشاهده خواهید کرد.
با این حال، ممکن است هنوز چندین سوال در مورد قراردادها داشته باشید. به عنوان مثال، اصلاً چرا از رابط ها استفاده کنیم؟ آیا استفاده از رابط ها پیچیده تر نیست؟ بیایید دلایل استفاده از رابط ها را به عناوین زیر تقطیر کنیم: اتصال شل و سادگی.
اتصال سست
ابتدا، اجازه دهید برخی از کدهایی را که به طور محکم با اجرای حافظه پنهان مرتبط هستند، مرور کنیم. موارد زیر را در نظر بگیرید:
<?php namespace App\Orders; class Repository{ /** * The cache instance. */ protected $cache; /** * Create a new repository instance. * * @param \SomePackage\Cache\Memcached $cache * @return void */ public function __construct(\SomePackage\Cache\Memcached $cache) { $this->cache = $cache; } /** * Retrieve an Order by ID. * * @param int $id * @return Order */ public function find($id) { if ($this->cache->has($id)) { // } }}
در این کلاس، کد به شدت با اجرای کش داده شده همراه است. این به شدت همراه است زیرا ما به یک کلاس کش بتن از یک فروشنده بسته وابسته هستیم. اگر API آن بسته تغییر کند، کد ما نیز باید تغییر کند.
به همین ترتیب، اگر بخواهیم فناوری حافظه پنهان (Memcached) خود را با فناوری دیگری (Redis) جایگزین کنیم، دوباره باید مخزن خود را اصلاح کنیم. مخزن ما نباید دانش زیادی در مورد اینکه چه کسی داده ها را به آنها ارائه می دهد یا چگونه آنها را ارائه می دهد، داشته باشد.
به جای این رویکرد، میتوانیم کد خود را با تکیه بر یک رابط کاربری ساده فروشنده بهبود دهیم:
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository{ /** * The cache instance. */ protected $cache; /** * Create a new repository instance. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; }}
اکنون کد با هیچ فروشنده خاصی یا حتی لاراول کوپل نشده است. از آنجایی که بسته قراردادها شامل هیچ پیادهسازی و هیچ وابستگی نیست، میتوانید به راحتی یک پیادهسازی جایگزین برای هر قراردادی بنویسید که به شما امکان میدهد پیادهسازی کش خود را بدون تغییر کد مصرف کننده حافظه پنهان جایگزین کنید.
سادگی
وقتی همه سرویسهای لاراول بهخوبی در رابطهای ساده تعریف میشوند، تعیین عملکرد ارائهشده توسط یک سرویس بسیار آسان است. قراردادها به عنوان مستندات مختصر به ویژگی های چارچوب عمل می کنند.
علاوه بر این، وقتی به رابط های ساده وابسته هستید، درک و نگهداری کد شما آسان تر است. به جای ردیابی اینکه کدام روش ها در یک کلاس بزرگ و پیچیده در دسترس شما هستند، می توانید به یک رابط ساده و تمیز مراجعه کنید.
نحوه استفاده از قراردادها
بنابراین، چگونه می توانید یک قرارداد را اجرا کنید؟ در واقع بسیار ساده است.
بسیاری از انواع کلاس ها در لاراول از طریق کانتینر سرویس حل می شوند ، از جمله کنترلرها، شنوندگان رویدادها، میان افزارها، مشاغل در صف و حتی بسته شدن مسیرها. بنابراین، برای اجرای یک قرارداد، فقط میتوانید رابط را در سازنده کلاسی که در حال حل شدن است، «تایپ-اشاره کنید».
به عنوان مثال، به این شنونده رویداد نگاهی بیندازید:
<?php namespace App\Listeners; use App\Events\OrderWasPlaced;use App\User;use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * The Redis factory implementation. */ protected $redis; /** * Create a new event handler instance. * * @param Factory $redis * @return void */ public function __construct(Factory $redis) { $this->redis = $redis; } /** * Handle the event. * * @param OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // }}
هنگامی که شنونده رویداد حل شد، کانتینر سرویس نکات نوع مربوط به سازنده کلاس را می خواند و مقدار مناسب را تزریق می کند. برای کسب اطلاعات بیشتر در مورد ثبت موارد در کانتینر سرویس، اسناد آن را بررسی کنید .
مرجع قرارداد
این جدول یک اشاره سریع به تمام قراردادهای لاراول و نماهای معادل آنها ارائه می دهد: