Bind کردن کلاس SamanGatewayAdapter

پرسیده شده
فعالیت 953 روز پیش
دیده شده 632 بار
0

سلام استاد، خسته نباشید

 

برای اجرای این مثال توی 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 در نظر گرفت و هر کدوم اوکی بود زنجیر همون جا قطع بشه؟ چطوری این چالشو شما حل می کنید؟

 

تشکر :)

 

 

 

 

فایل پیوست

نیما
نیما

24 شهریور 00

1
حذف شده

سلام خدمت شما. به جای تنظیم این مورد در دیتابیس به نظرم می تونید از config و env کمک بگیرید که منطقی تر هست و بعدش می تونید اونجا بر اساس مقادیر موجود در config کلاس مورد نظر رو bind کنید.

برای مورد دوم طبق گفته خودتون می تونید از الگوی chain  برای این مورد استفاده کنید که در صورتی درگاه ها طبق اولویت مشکل داشتن بره و درگاه بعدی رو فرخوانی کنه.

فایل پیوست

کیوان علی محمدی

توسط

کیوان علی محمدی

24 شهریور 00

جلسه هفته سوم - الگوی طراحی Adapter - مثال Payment Provider