فاساد Facades
مقدمه
فاساد ها برای دسترسی بصورت static
به سرویس های موجود درون اپلیکیشن مورد استفاده قرار میگیرند . فاساد های زیادی درون لاراول وجود دارد که شما بدون دانستن ساختار آن میتوانید از آنها استفاده نمایید . فاساد ، یک روش دسترسی به سرویس های موجود در اپلیکیشن می باشد و از طریق آن ها میتوانید متد های موجود در یک سرویس را بصورت استاتیک صدا بزنید .
ممکن است بخواهید برای پکیج های خود فاساد بسازید . برای این منظورشما را با مفهوم کلاس های فاساد بیشتر آشنا خواهیم کرد .
نکته : قبل از مطالعه بر روی کلاس های فاساد, پیشنهاد میکنیم با service container ها آشنا شوید.
تعریف
در لاراول ، یک فاساد به منظور دسترسی سریع به یک سرویس درون اپلیکیشن استفاده میشود . منطقی که این عملیات را انجام میدهد درون کلاس Facade
پایه قرار دارد و هر فاسادی که شما میسازید باید از کلاس Facade
پایه ، ارث بری کند .
کلاس های فاساد ایجاد شده توسط شما تنها باید یک متد با نام getFacadeAccessor
در خود داشته باشند ، این متد نام سرویسی که این فاساد باید به آن دسترسی داشته باشد را تعیین میکند .کلاس Facade
امکان استفاده از متد جادویی __callStatic()
را میدهد که به موجب آن میتوانید متد های درون سرویس را با این ترفند به صورت static اجرا نمایید . بنابراین ،
فاسادهای لاراول یک راه آسان برای دسترسی به سرویس ها می باشند .
برای مثال ، زمانی که فاساد Cache::get
را فراخوانی میکنید لاراول بدنبال آن ، متد get را از سرویس cache صدا میزند .
استفاده عملی
در مثال زیر ، یک متد static از فاساد cache صدا زده شده است و شما در نگا ه اول تصور خواهید کرد متد get
درون کلاس cache
وجود دارد.
$value = Cache::get('key');
اما , اگر به کلاس Illuminate\Support\Facades\Cache
یک نگاه بندازید ، خواهید دید که هیچ متد استاتیکی با نام get
وجود ندارد ! :
class Cache extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
کلاس cache
از کلاس Facade
ارث بری میکند و یک متد با نام getFacadeAccessor()
درخود دارد ، بیاد داشته باشید که این متد نام سرویسی که این فاساد میخواهد به آن دسترسی داشته باشد را برمیگرداند.
بنابراین ، فراخوانی Cache::get
مفهومی همانند کد زیر خواهد داشت :
$value = $app->make('cache')->get('key');
استفاده از یک فاساد
اگر قصد دارید از یک فاساد درون کنترلر های خود استفاده نمایید باید حتما آن را به namespace کنترولر خود اضافه کنید . تمامی فاساد ها در فضای global
قابل دسترس هستند :
<?php namespace App\Http\Controllers;
use Cache;
class PhotosController extends Controller {
/**
* Get all of the application photos.
*
* @return Response
*/
public function index()
{
$photos = Cache::get('photos');
//
}
}
ایجاد فاساد
ساخت فاساد برای پروژه یا پکیج بسیار ساده است . تنها 3 چیز را نیاز دارید :
- اضافه کردن سرویس .
- ایحاد یک کلاس فاساد.
- معرفی فاساد به فریموورک .
به مثال زیر توجه نمایید ، ما یک کلاس با نام PaymentGateway\Payment
تعریف کرده ایم.
namespace PaymentGateway;
class Payment {
public function process()
{
//
}
}
باید بتوانیم به کلاس مورد نظر به صورت یک سرویس دسترسی داشته باشیم . پس آن را به سرویس هایتان اضافه کنید :
App::bind('payment', function()
{
return new \PaymentGateway\Payment;
});
همچنین روش بهتری نیز وجود دارد که ابتدا یک service provider با نام PaymentServiceProvider
اینجاد میکنیم و دستورات بالا را درون متد register
آن اضافه میکنم و سپس آن را به آرایه سرویس ها در فایل config/app.php
اضافه میکنیم .
سپس ، فاساد آن را به روش زیر ایجاد میکنیم :
use Illuminate\Support\Facades\Facade;
class Payment extends Facade {
protected static function getFacadeAccessor() { return 'payment'; }
}
در پایان ، فاساد را به آرایه aliases
در فایل config/app.php
اضافه میکنیم . حالا میتوانید متد process
را از سرویس Payment
به روش زیر فراخوانی کنید :
Payment::process();
ماک کردن فاسادها
تست واحد (Unit testing) یکی از مهمترین قسمت های فاساد ها میباشد که نشان دهنده چگونگی عملکرد آنها می باشد . درواقع تست مهمترین دلیلی است که اهمیت وجود یک فاساد را مشخص میکند . برای اطلاعات بیشتر به مستندات mocking facades رجوع کنید .
مرجع فاساد های لاراول
در اینجا لیستی از تمامی فاساد ها به همراه سرویس های مرتبط با آنها نمایش داده شده است . اگر میخواهید بدانید که هر فاساد از کدام سرویس خدمت میگیرد میتوانید از لیست زیر کمک بگیرید . همچنین مشخصه هر سرویس (service container binding ) نیزمشخص شده است .