در یکی از پروژه ها که داشتیم زیر ساخت آن را توسعه می دادیم و از چند نوع provider استفاده میکردیم نیاز به ساختار و الگوییم داشتیم که طبق چارچوب و ساختاری عمل بکند، که اگر در آینده provider های دیگر برای ارائه خدمات اضافه شدند ضمن این که از اون ساختار پیروی کند، تغییرات زیادی در آن ایجاد نشود.
در جلسه ای که در مورد ساختار و معماری مناسب پروژه داشتیم بحث می کردیم، یکی از همکاران یک پیشنهاد خوب داد و اون ساختار پیشنهاد شده Driver-base در لاراول بود.
این ساختار یک الگو داخلی که خود لاراول از آن استفاده میکنه، بر خلاف داکیومنت کامل و جامع لاراول این ساختار اصلا جایی بهش پرداخته نشده و با توجه به این که در وب فارسی مقاله ای در مورد مفوم Driver-base ندیدم ترجیح دادم تجربه خودم رو در مورد این ساختار بنویسم.
زمانی مناسب هست که از الگو درایور (Driver) در لاراول استفاده کنیم که در پروژه مورد نظر نیاز هست که با چندین تامین کننده (Provider) ارتباط برقرار بکنید و نیاز دارید در یک یا چند فرایند بتوانید تامین کننده (Provider) مورد نظر خودتون تغییر بدید.
در این ساختار، هر تامین کننده (Provider) به عنوان یک درایور ایجاد می شود و میتوانید به صورت مستقل از هر کدام از آن ها استفاده کنید.
چند فسادی که خود لاراول در زیرساخت آن ها از ساختار درایوری استفاده کرده عبارتند از:
Log::debug('message'); Cache::get('key'); Session::get('key');
در این بخش میخوام به وسیله یک مثال بهتون یاد بدم که ساختار درایوری در لاراول چجوری پیاده سازی کنید. فرض کنید که میخواید یک میکروسرویسی ایجاد و توسعه بدید که کارش ایجاد و استعلام گواهی ssl باشه، خب برای خرید گواهی ssl دو تامین کننده خارجی معتبر به نام های Certum و Namecheap هستند که بیشتر سایت ها از خدمات اونها استفاده میکنند، پس بنابراین این دو تامین کننده در این پروژه ۲ درایور محسوب می شوند.
خب در ساختار درایوری لارول لیست درایور ها، تنظیمات هر کدام از آن ها و درایور پیش فرض در فایلی در دایرکتوری کانفیگ ایجاد و اضافه می شود.
پس در ابتدا نیاز داریم که یک فایل کانفیگ ایجاد کنیم که در آن درایور پیش فرض و تنظیمات هر کدارم از تامین کننده ها را در آن معلوم باشد.
// configs/ssl.php return [ 'default' => env('SSL_DRIVER', 'certum'), 'drivers' => [ 'certum' => [ 'username' => '', 'password' => '', ], 'namecheap' => [ 'username' => '', 'password' => ''. ] ] ]
بعد از ایجاد فایل کانفیگ نیاز هست که بستری ایجاد کنیم که بتونه درایور های ایجاد شده را مدیریت کنه، که لاراول برای آسان تر شدن این کار امکان استفاده از کلاسی به نام'Illuminate\Support\Manager
داده که با استفاده از آن میتونیم به راحتی درایور های ایجاده شده را به راحتی تغییر و استفاده کنیم.
برای ایجاد زیرساخت، در دایرکتوری App یک دایرکتوری به نام 'Services' ایجاد و کلاسی با نام SSLManager می سازیم.
<?php namespace App\Services; use Illuminate\Support\Manager; class SSLManager extends Manager { /** * Get the default driver name. * * @return string */ public function getDefaultDriver() { return $this->config->get('ssl.default'); } }
خب، با ایجاد کلاس مورد نظر درایور پیش فرض ما برای ایجاد SSL تامین کننده Certum میشه.
بعد از ایجاد کلاس لازم هست یک شی از آن را بسازیم تا بتونیم در همه جا از آن استفاده کنیم. برای این کار کد زیر در کلاس AppServiceProvider اضافه می کنیم.
$this->app->singleton('SSL', function ($app) { return new \App\Services\SSLManager($app); });
من نحوه ایجاد درایور یک تامین کننده در ادامه براتون مثال میزنم
<?php namespace App\SSLServices\Certum; use App\SSLServices\SSl; class CertumDriver implements SSl { protected $config; public function __construct($config) { $this->config = $config; } public function get() { // ...... } public function create() { // ..... } }
برای استفاده از درایور نیاز هست که کلاس مورد نظر در زیرساخت مدیریت گواهی ها که در قدم دوم ایجاد کرده بودید اضافه کنیم. برای این کار ۲ راه حل داریم:
$SSL = app('SSL'); $SSL->extend('certum', function ($app) { return new CertumDriver($app); });
public function createCertumDriver(): SSl { return new CertumDriver($this->config->get('ssl.drivers.certum')); }
فقط توجه داشته باشید برای ثبت درایور های دیگر باید ساختار متد مورد نظر، یعنی create[Drivername]Driver حفظ کنید.
برای راحتی در استفاده از کلاس مدیریت SSL میتونیم برای آن یک Facade ایجاد کنیم.
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class SSLFacade extends Facade { protected static function getFacadeAccessor() { return 'SSL'; } }
تمام شما تا ایجا تونستید ساختار driver-base در لارول پیاده سازی کنید و حالا به بعد در صورت نیاز به استفاده از متد هایی درایور های ایجاد شده از کد های زیر استفاده کنید:
SSLFacade::driver('certum')->get(); SSLFacade::create(); SSLFacade::get();
ممنون که تا این لحظه همراه من بودید. اگر سوال، انتقاد و یا پیشنهادی داشتید خوشحال میشم در بخش کامنت های این مطلب با من درمیون بزارید.
منابع: