سلام استاد، خسته نباشید
برای اجرای این مثال توی AppServiceProvider کد زیر رو نوشتم:
$this->app->bind(OnlineGateway::class, function () {
return new SamanGatewayAdapter(new SamanBankGateway('123'));
});
چون کلاس SamanGatewayAdapter کلاس SamanBankGateway رو توی متد سازندش میخواست که اونم یه apiKey میخواست. توی کنترولر مورد نظر هم خیلی ابسترکت مینویسیم:
$this->onlineGateway->startPay(new Invoice(1000));
حالا دو تا سوال داشتم:
1) اگر قرار باشه با یه کانفیگ توی دیتابیس، بانک مورد نظر تغییر کنه اینجا باید switch case بزاریم؟ یعنی هر Provider ای اضافه شد اینجا یه خط case برای binding اضافه کنیم؟ تمیزتر هم میشه نوشت؟
2) سوال بعدیم اینه: ما توی شرکت در هفته خیلی پیش میومد که درگاه یه بانکی برای 30 دقیقه از کار میافتاد و چون پرداختها زیاد بود، مشتریها پرداخت هاشون به مشکل میخورد.
اومدیم چند تا درگاه گرفتیم. بعد توی دیتابیس اولویت بندی کردیم ولی یکیشو فعال کردم. بعد هر زمان که یه بانکی درگاهش کار نمیکرد میاومدیم سوئیچ میکردیم رو یه بانک دیگه (بر اساس اولویت تعریف شده) و اون رو فعال میکردیم.
البته یه روال هم گذاشته بودیم که در لحظه سوئیچ اولین کاربری که به مشکل میخورد اون لحظه بانک سوئیچ میکرد و برای یه لحظه بقیه لاک میشدند تا سوئیچ انجام بشه. وقفه ای هم حس نکردیم.
حالا این روش روش خوبیه یا ایده بهتری هم میشه داشت؟ چه پترنی میتونه اینجا کمک کنه؟ میشه درگاها رو chain در نظر گرفت و هر کدوم اوکی بود زنجیر همون جا قطع بشه؟ چطوری این چالشو شما حل میکنید؟
تشکر :)