💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ نیما
Bind کردن کلاس SamanGatewayAdapter
کیوان علی محمدی حل شده توسط کیوان علی محمدی

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

 

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

 

تشکر :)

 

 

 

 

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

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

بهترین پاسخ
کیوان علی محمدی ۲۴ شهریور ۱۴۰۰، ۰۹:۱۲