نسخه:

قراردادها

معرفی

قراردادهای لاراول مجموعه ای از اینترفیس ها هستند که خدمات اصلی ارائه شده توسط فریم ورک را تعریف می کنند. به عنوان مثال، یک 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;
}
 
}

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

سادگی

وقتی همه سرویس‌های لاراول به‌خوبی در رابط‌های ساده تعریف می‌شوند، تعیین عملکرد ارائه‌شده توسط یک سرویس بسیار آسان است. قراردادها به عنوان مستندات مختصر به ویژگی های چارچوب عمل می کنند.

علاوه بر این، وقتی به رابط های ساده وابسته هستید، درک و نگهداری کد شما آسان تر است. به جای ردیابی اینکه کدام روش ها در یک کلاس بزرگ و پیچیده در دسترس شما هستند، می توانید به یک رابط ساده و تمیز مراجعه کنید.

مرجع قرارداد

این یک اشاره به اکثر قراردادهای لاراول و همچنین همتایان لاراول "نما" آنها است:

قرارداد Laravel 4.x Facade
Illuminate\Contracts\Auth\Guard احراز هویت
Illuminate\Contracts\Auth\PasswordBroker کلمه عبور
Illuminate\Contracts\Bus\Dispatcher مسیر
Illuminate\Contracts\Cache\Repository حافظه پنهان
Illuminate\Contracts\Cache\Factory کش::driver()
Illuminate\Contracts\Config\Repository پیکربندی
Illuminate\Contracts\Container\Container برنامه
Illuminate\Contracts\Cookie\Factory کوکی
Illuminate\Contracts\Cookie\QueueingFactory کوکی::queue()
Illuminate\Contracts\Encryption\Encrypter دخمه
Illuminate\Contracts\Events\Dispatcher رویداد
Illuminate\Contracts\Filesystem\Cloud  
Illuminate\Contracts\Filesystem\Factory فایل
Illuminate\Contracts\Filesystem\Filesystem فایل
Illuminate\Contracts\Foundation\Application برنامه
Illuminate\Contracts\Hashing\Hasher هش
Illuminate\Contracts\Logging\Log ورود به سیستم
Illuminate\Contracts\Mail\MailQueue Mail::queue()
Illuminate\Contracts\Mail\Mailer ایمیل
Illuminate\Contracts\Queue\Factory صف::driver()
Illuminate\Contracts\Queue\Queue صف
Illuminate\Contracts\Redis\Database ردیس
Illuminate\Contracts\Routing\Registrar مسیر
Illuminate\Contracts\Routing\ResponseFactory واکنش
Illuminate\Contracts\Routing\UrlGenerator URL
Illuminate\Contracts\Support\Arrayable  
Illuminate\Contracts\Support\Jsonable  
Illuminate\Contracts\Support\Renderable  
Illuminate\Contracts\Validation\Factory اعتبار سنجی::make()
Illuminate\Contracts\Validation\Validator  
Illuminate\Contracts\View\Factory مشاهده::make()
Illuminate\Contracts\View\View  

نحوه استفاده از قراردادها

بنابراین، چگونه می توانید یک قرارداد را اجرا کنید؟ در واقع بسیار ساده است. بسیاری از انواع کلاس ها در لاراول از طریق کانتینر سرویس حل می شوند ، از جمله کنترلرها، شنوندگان رویدادها، فیلترها، کارهای صف و حتی بسته شدن مسیرها. بنابراین، برای اجرای یک قرارداد، فقط می‌توانید رابط را در سازنده کلاسی که در حال حل شدن است، «تایپ-اشاره کنید». به عنوان مثال، به این کنترل کننده رویداد نگاهی بیندازید:

<?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)
{
//
}
 
}

هنگامی که شنونده رویداد حل شد، کانتینر سرویس نکات نوع مربوط به سازنده کلاس را می خواند و مقدار مناسب را تزریق می کند. برای کسب اطلاعات بیشتر در مورد ثبت موارد در کانتینر خدمات، مستندات را بررسی کنید .