Как я понимаю, вся ваша проблема в том, чтобы создать правильную реализацию, даже если ваша логика c делает это в конце, вызывая $this->payment = app($type);
. Основная концепция все еще в этом контексте, какой поставщик вам нужен. Есть много вариантов для этого, сервис, фабрика и др. c. но сделать эту версию для контейнерного провайдера действительно мощно и чисто, когда вы находитесь в Laravel
.
Представьте, что у вас есть PaymentProviderInterface
, я бы связал это, чтобы решить, какого поставщика платежей использовать. Объедините это с тем, что вы в любом контексте можете разрешить объект запроса, и вы можете переместить все это поставщику, я бы создал новый. PaymentProvider
и зарегистрируйте его как любого другого провайдера.
class PaymentsProvider {
public const APPLE_PAYMENT_PROVIDER = 'apple';
public const GOOGLE_PAYMENT_PROVIDER = 'google';
public const ANDROID_PAYMENT_PROVIDER = 'android';
public function boot() {
$this->app->bind(PaymentProviderInterface::class, function () {
/** @var Request $request **/
$request = resolve(Request::class);
$type = null;
if($request->aaa == 'aaa') {
$type = $this->resolvePaymentByType($request->type);
} else {
$type = $this->resolvePaymentByCode($request->code);
}
return resolve($type);
});
}
private function resolvePaymentByType(string $type): string
{
if ($type === '001') {
return static::APPLE_PAYMENT_PROVIDER;
}
if ($type === '111') {
return static::GOOGLE_PAYMENT_PROVIDER;
}
throw new Exception('Invalid state');
}
private function resolvePaymentByCode(string $code): string
{
if ($type === static::ANDROID_PAYMENT_PROVIDER) {
return static::ANDROID_PAYMENT_PROVIDER;
}
throw new Exception('Invalid state');
}
}
В общем, я не люблю переключать случаи, вы можете использовать их, если хотите, я думаю, что это более чисто. Еще одна небольшая оптимизация, вместо использования констант magi c с использованием констант, она более читабельна и имеет большой потенциал роста. Так как мы связали все с PaymentProviderInterface
, это сделало бы ваш контроллер действительно чистым, решив вашего провайдера следующим образом. Чтобы избежать условий, когда у вас нет запроса, я бы вводил в каждый метод.
class PaymentController extends Controller
{
public function pay(PaymentProviderInterface $payment){
$payment->pay();
}