نسخه:

قراردادها

معرفی

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

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

مرجع قرارداد

این جدول یک اشاره سریع به تمام قراردادهای لاراول و نماهای معادل آنها ارائه می دهد:

قرارداد مراجع نما
Illuminate\Contracts\Auth\Access\Authorizable   
Illuminate\Contracts\Auth\Access\Gate Gate
Illuminate\Contracts\Auth\Authenticatable   
Illuminate\Contracts\Auth\CanResetPassword  
Illuminate\Contracts\Auth\Factory Auth
Illuminate\Contracts\Auth\Guard Auth::guard()
Illuminate\Contracts\Auth\PasswordBroker Password::broker()
Illuminate\Contracts\Auth\PasswordBrokerFactory Password
Illuminate\Contracts\Auth\StatefulGuard  
Illuminate\Contracts\Auth\SupportsBasicAuth  
Illuminate\Contracts\Auth\UserProvider  
Illuminate\Contracts\Bus\Dispatcher Bus
Illuminate\Contracts\Bus\QueueingDispatcher Bus::dispatchToQueue()
Illuminate\Contracts\Radcasting\Factory Broadcast
Illuminate\Contracts\Broadcasting\Broadcaster Broadcast::connection()
Illuminate\Contracts\Broadcasting\ShouldBroadcast  
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow  
Illuminate\Contracts\Cache\Factory Cache
Illuminate\Contracts\Cache\Lock  
Illuminate\Contracts\Cache\LockProvider  
Illuminate\Contracts\Cache\Repository Cache::driver()
Illuminate\Contracts\Cache\Store  
Illuminate\Contracts\Config\Repository Config
Illuminate\Contracts\Console\Application  
Illuminate\Contracts\Console\Kernel Artisan
Illuminate\Contracts\Container\Container App
Illuminate\Contracts\Cookie\Factory Cookie
Illuminate\Contracts\Cookie\QueueingFactory Cookie::queue()
Illuminate\Contracts\Database\ModelIdentifier  
Illuminate\Contracts\Debug\ExceptionHandler  
Illuminate\Contracts\Encryption\Encrypter Crypt
Illuminate\Contracts\Events\Dispatcher Event
Illuminate\Contracts\Filesystem\Cloud Storage::cloud()
Illuminate\Contracts\Filesystem\Factory Storage
Illuminate\Contracts\Filesystem\Filesystem Storage::disk()
Illuminate\Contracts\Foundation\Application App
Illuminate\Contracts\Hashing\Hasher Hash
Illuminate\Contracts\Http\Kernel  
Illuminate\Contracts\Mail\MailQueue Mail::queue()
Illuminate\Contracts\Mail\Mailable  
Illuminate\Contracts\Mail\Mailer Mail
Illuminate\Contracts\Notifications\Dispatcher Notification
Illuminate\Contracts\Notifications\Factory Notification
Illuminate\Contracts\Pagination\LengthAwarePaginator  
Illuminate\Contracts\Pagination\Paginator  
Illuminate\Contracts\Pipeline\Hub  
Illuminate\Contracts\Pipeline\Pipeline  
Illuminate\Contracts\Queue\EntityResolver  
Illuminate\Contracts\Queue\Factory Queue
Illuminate\Contracts\Queue\Job  
Illuminate\Contracts\Queue\Monitor Queue
Illuminate\Contracts\Queue\Queue Queue::connection()
Illuminate\Contracts\Queue\QueueableCollection  
Illuminate\Contracts\Queue\QueueableEntity  
Illuminate\Contracts\Queue\ShouldQueue  
Illuminate\Contracts\Redis\Factory Redis
Illuminate\Contracts\Routing\BindingRegistrar Route
Illuminate\Contracts\Routing\Registrar Route
Illuminate\Contracts\Routing\ResponseFactory Response
Illuminate\Contracts\Routing\UrlGenerator URL
Illuminate\Contracts\Routing\UrlRoutable  
Illuminate\Contracts\Session\Session Session::driver()
Illuminate\Contracts\Support\Arrayable  
Illuminate\Contracts\Support\Htmlable  
Illuminate\Contracts\Support\Jsonable  
Illuminate\Contracts\Support\MessageBag  
Illuminate\Contracts\Support\MessageProvider  
Illuminate\Contracts\Support\Renderable  
Illuminate\Contracts\Support\Responsible  
Illuminate\Contracts\Translation\Loader  
Illuminate\Contracts\Translation\Mternlator Lang
Illuminate\Contracts\Validation\Factory Validator
Illuminate\Contracts\Validation\ImplicitRule  
Illuminate\Contracts\Validation\Rule  
Illuminate\Contracts\Validation\ValidatesWhenResolved  
Illuminate\Contracts\Validation\Validator Validator::make()
Illuminate\Contracts\View\Engine  
Illuminate\Contracts\View\Factory View
Illuminate\Contracts\View\View View::make()