В Laravel контракты — это набор интерфейсов, определяющих методы, которые должны быть реализованы конкретными классами. Контракты используются для создания контракта между различными частями вашего приложения, такими как службы и репозитории, гарантируя доступность определенных методов для использования. Вот как использовать контракты в Laravel:

  1. Определить контракт (интерфейс):

Сначала определите контракт, создав интерфейс, в котором объявляются методы, которые вы хотите применить. Обычно интерфейсы контракта размещаются в каталоге app/Contracts. Например, создайте контракт PaymentGateway:

// app/Contracts/PaymentGateway.php

namespace App\Contracts;

interface PaymentGateway
{
    public function charge($amount);
    public function refund($transactionId);
}

2. Создайте конкретные реализации:

Затем создайте один или несколько конкретных классов, реализующих интерфейс контракта. Эти классы должны обеспечивать фактическую реализацию методов, объявленных в контракте. Поместите эти классы в соответствующий каталог, например app/Services.

// app/Services/PaypalPaymentGateway.php

namespace App\Services;

use App\Contracts\PaymentGateway;

class PaypalPaymentGateway implements PaymentGateway
{
    public function charge($amount)
    {
        // Implement Paypal payment charging logic here.
    }

    public function refund($transactionId)
    {
        // Implement Paypal refund logic here.
    }
}
// app/Services/StripePaymentGateway.php

namespace App\Services;

use App\Contracts\PaymentGateway;

class StripePaymentGateway implements PaymentGateway
{
    public function charge($amount)
    {
        // Implement Stripe payment charging logic here.
    }

    public function refund($transactionId)
    {
        // Implement Stripe refund logic here.
    }
}

3. Привязка контракта к конкретным классам:

Чтобы использовать контракт, привяжите его к определенному конкретному классу в сервисном контейнере Laravel. Вы можете сделать это в AppServiceProvider или у поставщика услуг, соответствующего вашим контрактам. Откройте AppServiceProvider.php и добавьте привязку в метод register:

use App\Contracts\PaymentGateway;
use App\Services\PaypalPaymentGateway;
use App\Services\StripePaymentGateway;

public function register()
{
    $this->app->bind(PaymentGateway::class, function ($app) {
        // Return the desired payment gateway implementation here.
        // Example: return new PaypalPaymentGateway();
        return new StripePaymentGateway();
    });
}

4. Использование контракта:

Теперь вы можете использовать контракт в своих контроллерах, службах или других частях вашего приложения. Контейнер внедрения зависимостей Laravel автоматически разрешит соответствующий конкретный класс, когда вы вводите подсказку в интерфейсе контракта:

use App\Contracts\PaymentGateway;

class PaymentController extends Controller
{
    protected $paymentGateway;

    public function __construct(PaymentGateway $paymentGateway)
    {
        $this->paymentGateway = $paymentGateway;
    }

    public function charge()
    {
        // Use the payment gateway to charge the customer.
        $this->paymentGateway->charge(100);
    }

    public function refund()
    {
        // Use the payment gateway to process refunds.
        $this->paymentGateway->refund('transaction123');
    }
}

Используя контракты в Laravel, вы можете легко заменять разные реализации одного и того же контракта, делая ваш код более гибким и удобным в сопровождении. Это также помогает при тестировании, позволяя использовать макетные реализации во время модульного тестирования.