Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Коли контейнеру потрібна прив'язка, а коли він обходиться без неї?

Контейнер уміє будувати класи сам: читає конструктор через рефлексію й рекурсивно створює залежності.

class InvoiceService
{
    public function __construct(private PdfRenderer $pdf, private Mailer $mailer) {}
}

// у контролері достатньо оголосити - контейнер створить усе дерево
public function send(InvoiceService $invoices) { /* ... */ }

Без прив'язки працює, якщо всі залежності - конкретні класи без скалярних параметрів.

Прив'язка потрібна в трьох випадках:

  1. Інтерфейс. Контейнер не вгадує реалізацію:
$this->app->bind(PaymentGateway::class, StripeGateway::class);

Без цього - виняток Target [PaymentGateway] is not instantiable.

  1. Скалярні параметри - ключ API, таймаут. Їх передають контекстною прив'язкою чи атрибутом #[Config('services.stripe.key')].

  2. Особливий спосіб створення або один екземпляр - клієнт з налаштуванням, singleton() для дорогого об'єкта.

Порада: не реєструйте прив'язку для кожного класу «про всяк випадок». Конкретні класи контейнер створить сам, а зайві рядки в провайдері лише ускладнюють пошук того, що справді налаштовано.

Докладніше в документації: Розв'язання без конфігурації

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання