Laravel 13 Hidden Feature: Contextual Binding That Can Change Your Entire Architecture
Laravel 13 Advanced Feature Most Developers Ignore
Most developers use dependency injection like this.
public function __construct(PaymentService $payment){$this->payment = $payment;}
But very few developers understand the power of contextual binding inside the **Laravel service container.
This feature can completely change how you design large applications.
Problem Example
Imagine you have two payment gateways.
Stripe
Razorpay
Basic interface:
interface PaymentGateway{public function charge($amount);}
Stripe implementation
class StripePayment implements PaymentGateway{public function charge($amount){return "Paid using Stripe: ".$amount;}}
Razorpay implementation
class RazorpayPayment implements PaymentGateway{public function charge($amount){return "Paid using Razorpay: ".$amount;}}Normal Binding
In ServiceProvider
$this->app->bind(PaymentGateway::class, StripePayment::class);Now every class receives StripePayment.
But what if:
Admin panel → Razorpay
User checkout → StripeThis is where contextual binding becomes powerful.
Laravel 13 Contextual Binding
$this->app->when(AdminPaymentController::class)->needs(PaymentGateway::class)->give(RazorpayPayment::class);$this->app->when(UserCheckoutController::class)->needs(PaymentGateway::class)->give(StripePayment::class);Now Laravel automatically injects the correct payment service.
Controller Example
class UserCheckoutController{protected $payment;public function __construct(PaymentGateway $payment){$this->payment = $payment;}public function pay(){return $this->payment->charge(1000);}}Laravel automatically resolves the correct implementation.
No manual logic required.
Why This Is Powerful
You can build:
Multi-payment systems
Multi-database architecturesMicroservice adapters
Feature-based dependency injectionAll controlled by the service container.
Pro Laravel Developer Trick
You can even inject different services for different jobs.
Example:
Queue job uses sandbox payment gateway.
$this->app->when(ProcessRefundJob::class)->needs(PaymentGateway::class)->give(SandboxPayment::class);Now your production checkout and background jobs use different services.
Clean architecture.
Also Read : Laravel Race Conditions Explained: Prevent Hidden Data Corruption with Atomic Locks

Comments
Post a Comment