В нашей предыдущей статье (Как добавить и реализовать интерфейсы обработки платежей в Laravel 11: жестко закодированная привязка) мы рассмотрели первый шаг в настройке платежных процессоров путем жесткого кодирования привязки между PaymentProcessorInterface и конкретная реализация, например StripePaymentProcessor.
Хотя этот подход прост и эффективен для небольших приложений, ему не хватает гибкости для более сложных сценариев, где вам может потребоваться обработка нескольких платежных шлюзов, но использование интерфейса позволило нам отделить код, чтобы мы могли его дальше расширять, в соответствии с принципом открытия-закрытия, чтобы внедрить надлежащую функциональность:
Во второй части мы углубимся в контекстную привязку, более продвинутую технику в сервис-контейнере Laravel, которая позволяет вам внедрять различные реализации интерфейса на основе конкретного контекста. Это полезно, когда выбор платежного процессора зависит от состояния приложения, например от того, какой контроллер обрабатывает запрос.
Контекстная привязка в Laravel позволяет контейнеру службы внедрять различные реализации интерфейса в зависимости от класса или контекста, запрашивающего его. Вместо того, чтобы полагаться на единую, жестко запрограммированную реализацию, мы можем использовать контекстную привязку для определения различных платежных процессоров на основе контроллера или какого-либо другого контекстного фактора.
Давайте начнем с настройки контекстных привязок в AppServiceProvider. Мы свяжем разные платежные системы в зависимости от контроллера, который их запрашивает. Например, StripePaymentController будет использовать StripePaymentProcessor, а PayPalPaymentController будет использовать PayPalPaymentProcessor.
Вот как это можно сделать:
use App\Contracts\PaymentProcessorInterface; use App\Services\StripePaymentProcessor; use App\Services\PayPalPaymentProcessor; public function register() { $this->app->when(StripePaymentController::class) ->needs(PaymentProcessorInterface::class) ->give(StripePaymentProcessor::class); $this->app->when(PayPalPaymentController::class) ->needs(PaymentProcessorInterface::class) ->give(PayPalPaymentProcessor::class); }
Что здесь происходит?
Благодаря контекстной привязке каждый контроллер теперь может автоматически внедрять свой выделенный платежный процессор. Вот как вы можете настроить контроллеры:
Пример: StripePaymentController
use App\Contracts\PaymentProcessorInterface; class StripePaymentController extends Controller { protected $paymentProcessor; public function __construct(PaymentProcessorInterface $paymentProcessor) { $this->paymentProcessor = $paymentProcessor; } // Methods to handle Stripe-specific payments... }
Пример: PayPalPaymentController
use App\Contracts\PaymentProcessorInterface; class PayPalPaymentController extends Controller { protected $paymentProcessor; public function __construct(PaymentProcessorInterface $paymentProcessor) { $this->paymentProcessor = $paymentProcessor; } // Methods to handle PayPal-specific payments... }
В обоих примерах Laravel автоматически добавляет правильный платежный процессор на основе контекста контроллера. Это происходит благодаря контекстной привязке, настроенной в AppServiceProvider.
Контекстная привязка особенно полезна, когда вы знаете, какую реализацию интерфейса использовать на основе конкретных классов или контекстов, например контроллеров. Это помогает поддерживать чистоту и управляемость вашего кода, особенно при работе с несколькими платежными шлюзами, каждый из которых имеет свой собственный контроллер.
В этом посте мы рассмотрели, как реализовать контекстную привязку в Laravel 11 для обработки платежей. Вот краткий обзор преимуществ этого подхода:
В следующем посте мы рассмотрим шаблон Factory, который позволяет динамически выбирать платежные процессоры во время выполнения, обеспечивая еще большую гибкость для сложных приложений.
Ждите следующей части, где мы расскажем, как использовать фабрики для обработки платежей в Laravel 11!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3