قراردادها
معرفی
قراردادهای لاراول مجموعه ای از اینترفیس ها هستند که خدمات اصلی ارائه شده توسط فریم ورک را تعریف می کنند.
به عنوان مثال، یک
Queue
قرارداد روش های مورد نیاز برای صف بندی مشاغل را تعریف می کند، در حالی که
Mailer
قرارداد روش های مورد نیاز برای ارسال ایمیل را تعریف می کند.
هر قرارداد دارای یک اجرای متناظر است که توسط چارچوب ارائه شده است.
به عنوان مثال، لاراول یک
Queue
پیاده سازی با انواع درایورها و
Mailer
پیاده سازی ارائه می دهد که توسط
SwiftMailer
ارائه می شود .
همه قراردادهای لاراول در مخزن GitHub خود زندگی می کنند . این یک نقطه مرجع سریع برای تمام قراردادهای موجود و همچنین یک بسته مجزا و جدا شده است که ممکن است توسط سایر توسعه دهندگان بسته استفاده شود.
چرا قراردادها؟
ممکن است چندین سوال در مورد قراردادها داشته باشید. اصلا چرا از رابط ها استفاده کنیم؟ آیا استفاده از رابط ها پیچیده تر نیست؟
بیایید دلایل استفاده از رابط ها را به عناوین زیر تقطیر کنیم: اتصال شل و سادگی.
اتصال سست
ابتدا، اجازه دهید برخی از کدهایی را که به طور محکم با اجرای حافظه پنهان مرتبط هستند، مرور کنیم. موارد زیر را در نظر بگیرید:
<?php namespace App\Orders; class Repository { /** * The cache. */ 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 { /** * Create a new repository instance. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
اکنون کد با هیچ فروشنده خاصی یا حتی لاراول کوپل نشده است. از آنجایی که بسته قراردادها شامل هیچ پیادهسازی و هیچ وابستگی نیست، میتوانید به راحتی یک پیادهسازی جایگزین برای هر قراردادی بنویسید که به شما امکان میدهد پیادهسازی کش خود را بدون تغییر کد مصرف کننده حافظه پنهان جایگزین کنید.
سادگی
وقتی همه سرویسهای لاراول بهخوبی در رابطهای ساده تعریف میشوند، تعیین عملکرد ارائهشده توسط یک سرویس بسیار آسان است. قراردادها به عنوان مستندات مختصر به ویژگی های چارچوب عمل می کنند.
علاوه بر این، وقتی به رابط های ساده وابسته هستید، درک و نگهداری کد شما آسان تر است. به جای ردیابی اینکه کدام روش ها در یک کلاس بزرگ و پیچیده در دسترس شما هستند، می توانید به یک رابط ساده و تمیز مراجعه کنید.
مرجع قرارداد
این یک اشاره به اکثر قراردادهای لاراول و همچنین همتایان لاراول "نما" آنها است:
نحوه استفاده از قراردادها
بنابراین، چگونه می توانید یک قرارداد را اجرا کنید؟ در واقع بسیار ساده است. بسیاری از انواع کلاس ها در لاراول از طریق کانتینر سرویس حل می شوند ، از جمله کنترلرها، شنوندگان رویدادها، فیلترها، کارهای صف و حتی بسته شدن مسیرها. بنابراین، برای اجرای یک قرارداد، فقط میتوانید رابط را در سازنده کلاسی که در حال حل شدن است، «تایپ-اشاره کنید». به عنوان مثال، به این کنترل کننده رویداد نگاهی بیندازید:
<?php namespace App\Handlers\Events; use App\User;use App\Events\NewUserRegistered;use Illuminate\Contracts\Redis\Database; class CacheUserInformation { /** * The Redis database implementation. */ protected $redis; /** * Create a new event handler instance. * * @param Database $redis * @return void */ public function __construct(Database $redis) { $this->redis = $redis; } /** * Handle the event. * * @param NewUserRegistered $event * @return void */ public function handle(NewUserRegistered $event) { // } }
هنگامی که شنونده رویداد حل شد، کانتینر سرویس نکات نوع مربوط به سازنده کلاس را می خواند و مقدار مناسب را تزریق می کند. برای کسب اطلاعات بیشتر در مورد ثبت موارد در کانتینر خدمات، مستندات را بررسی کنید .