آشنایی با مفهوم Driver-based و نحوه راه ندازی و توسعه آن در لاراول

آشنایی با مفهوم Driver-based و نحوه راه ندازی و توسعه آن در لاراولدر یکی از پروژه ها که داشتیم زیر ساخت آن را توسعه می دادیم و از چند نوع provider استفاده میکردیم نیاز به ساختار و الگوییم داشتیم که طبق چارچوب و ساختاری عمل بکند، که اگر در آینده provider های دیگر برای ارائه خدمات اضافه شدند ضمن این که از اون ساختار پیروی کند، تغییرات زیادی در آن ایجاد نشود.در جلسه ای که در مورد ساختار و معماری مناسب پروژه داشتیم بحث می کردیم، یکی از همکاران یک پیشنهاد خوب داد و اون ساختار پیشنهاد شده Driver-base در لاراول بود. این ساختار یک الگو داخلی که خود لاراول از آن استفاده میکنه، بر خلاف داکیومنت کامل و جامع لاراول این ساختار اصلا جایی بهش پرداخته نشده و با توجه به این که در وب فارسی مقاله ای در مورد مفوم Driver-base ندیدم ترجیح دادم تجربه خودم رو در مورد این ساختار بنویسم.چه موقع بهتر هست از ساختار Driver-base در لاراول استفاده کنیم؟زمانی مناسب هست که از الگو درایور (Driver) در لاراول استفاده کنیم که در پروژه مورد نظر نیاز هست که با چندین تامین کننده (Provider) ارتباط برقرار بکنید و نیاز دارید در یک یا چند فرایند بتوانید تامین کننده (Provider) مورد نظر خودتون تغییر بدید.در این ساختار، هر تامین کننده (Provider) به عنوان یک درایور ایجاد می شود و میتوانید به صورت مستقل از هر کدام از آن ها استفاده کنید.چند فسادی که خود لاراول در زیرساخت آن ها از ساختار درایوری استفاده کرده عبارتند از:Log::debug('message'); Cache::get('key'); Session::get('key');مزایا پیاده سازی ساختار درایوری (Driver-based)با استفاده از الگوی Driver-based در لاراول، شما قادر خواهید بود به سادگی درایورهای مختلف را به برنامه اضافه کنید و از تامین کننده های مختلف استفاده کنید. ساختار مورد نظر این امکان را به کد شما می‌دهد تا براحتی با تغییرات و افزودن منابع جدید سازگارباشد.با استفاده از درایورها در لاراول، شما قادر خواهید بود کد مربوط به ارتباط با تامین کننده های مختلف را جدا کنید. این امر باعث می‌شود کد شما مرتب وخواناتر باشد.با جداسازی کد و استفاده از درایورها، تست و نگهداری برنامه راحت‌تر خواهد بود. شما می‌توانید درایورهای مربوط به تامین کننده های مختلف را به صورت مستقل تست کنید و در صورت بروز خطا، مشکل مورد نظر را رفع کنید.شما می توانید هر تنظیماتی که میخواید و در درایورد مورد نظر استفاده شود در فایل کانفیگ مربوطه اضافه کنید و در وقتش از اون به راحتی استفاده کنید.در صورتی که در فرایند نیاز به تغییر منبع خارجی دارید می توانید به راحتی با تغییر درایور آن را انجام بدید معایب پیاده سازی ساختار درایوری (Driver-based)در پروژه های بزرگ در صورت اضافه شده درایور ها و تامین کننده های مختلف زیاد امکان پیچیدگی در کد ایجاد می شود. در این ساختار شما باید به ازای هر تامین کننده خارجی که استفاده می کنید یک درایور بسازید و طبق الگوی ایجاد شده پیش روید،‌که این ممکن هست هزینه زمانی زیادی در ابتدا برای شما داشته باشد.بعضی از تنظیمات لازم هست در فایل کانفیگ قرار بگیرد تا بعد ها در صورت تغییر لازم نباشد در کد تغییری ایجاد شود و با یک تغییر کوچک در فایل کانفیگ همه جا تغییر کند. اما گاهی اوقات تنظییمات آنقدر زیاد و پیچیده هست که بعد ها تغییر آن سخت می شود. برای همین باید نسبت به ست کردن تنظیمات در فایل کانفیگ دقت زیادی داشته باشد و سعی کنید آن را مدیریت کنید.نحوه پیاده سازی ساختار Driver-based در لاراولدر این بخش میخوام به وسیله یک مثال بهتون یاد بدم که ساختار درایوری در لاراول چجوری پیاده سازی کنید. فرض کنید که میخواید یک میکروسرویسی ایجاد و توسعه بدید که کارش ایجاد و استعلام گواهی 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); });قدم سوم: ایجاد درایوریک دایرکتوری با نام دلخوا (که من در این مثال اسمشو SSLServices میزارم) ایجاد میکنیم.خرید گواهی و استعلام آن فرایند هایی هستند که در همه جا از آن ها استفاده میشه پس باید ساختاری ایجاد کرد که تمام درایور ها از اون ساختار پیروی کنند.در قدم بعدی به ازای هر تامین کننده یک دایرکتوری ایجاد میکنیم که منطق هر کدام از تامین کننده ها در اون دایرکتوری نوشته می شه.من نحوه ایجاد درایور یک تامین کننده در ادامه براتون مثال میزنم<?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() { // ..... } }قدم چهارم: ثبت درایوربرای استفاده از درایور نیاز هست که کلاس مورد نظر در زیرساخت مدیریت گواهی ها که در قدم دوم ایجاد کرده بودید اضافه کنیم. برای این کار ۲ راه حل داریم:ثبت درایور در AppServiceProvider :$SSL = app('SSL'); $SSL->extend('certum', function ($app) { return new CertumDriver($app); });ثبت درایور در خود کلاس مدیریت گواهی ها (یعنی SSLManager ) :public function createCertumDriver(): SSl { return new CertumDriver($this->config->get('ssl.drivers.certum')); } فقط توجه داشته باشید برای ثبت درایور های دیگر باید ساختار متد مورد نظر، یعنی create[Drivername]Driver حفظ کنید.قدم پنجم: ایجاد Facadeبرای راحتی در استفاده از کلاس مدیریت 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(); ممنون که تا این لحظه همراه من بودید. اگر سوال، انتقاد و یا پیشنهادی داشتید خوشحال میشم در بخش کامنت های این مطلب با من درمیون بزارید.منابع: https://inspector.dev/how-to-extend-laravel-with-driver-based-services/ https://pineco.de/drivers-and-managers-in-laravel/