فاساد 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 ) نیزمشخص شده است .

فاساد نام سرویس مشخصه سرویس
App Illuminate\Foundation\Application app
Artisan Illuminate\Console\Application artisan
Auth Illuminate\Auth\AuthManager auth
Auth (Instance) Illuminate\Auth\Guard
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher
Cache Illuminate\Cache\CacheManager cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (Instance) Illuminate\Database\Connection
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Hash Illuminate\Contracts\Hashing\Hasher hash
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Password Illuminate\Auth\Passwords\PasswordBroker auth.password
Queue Illuminate\Queue\QueueManager queue
Queue (Instance) Illuminate\Queue\QueueInterface
Queue (Base Class) Illuminate\Queue\Queue
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Contracts\Routing\ResponseFactory
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint
Session Illuminate\Session\SessionManager session
Session (Instance) Illuminate\Session\Store
Storage Illuminate\Contracts\Filesystem\Factory filesystem
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator (Instance) Illuminate\Validation\Validator
View Illuminate\View\Factory view
View (Instance) Illuminate\View\View