В Laravel контракты — это набор интерфейсов, определяющих методы, которые должны быть реализованы конкретными классами. Контракты используются для создания контракта между различными частями вашего приложения, такими как службы и репозитории, гарантируя доступность определенных методов для использования. Вот как использовать контракты в Laravel:
- Определить контракт (интерфейс):
Сначала определите контракт, создав интерфейс, в котором объявляются методы, которые вы хотите применить. Обычно интерфейсы контракта размещаются в каталоге 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, вы можете легко заменять разные реализации одного и того же контракта, делая ваш код более гибким и удобным в сопровождении. Это также помогает при тестировании, позволяя использовать макетные реализации во время модульного тестирования.