Контейнер уміє будувати класи сам: читає конструктор через рефлексію й рекурсивно створює залежності.
class InvoiceService
{
public function __construct(private PdfRenderer $pdf, private Mailer $mailer) {}
}
// у контролері достатньо оголосити - контейнер створить усе дерево
public function send(InvoiceService $invoices) { /* ... */ }
Без прив'язки працює, якщо всі залежності - конкретні класи без скалярних параметрів.
Прив'язка потрібна в трьох випадках:
- Інтерфейс. Контейнер не вгадує реалізацію:
$this->app->bind(PaymentGateway::class, StripeGateway::class);
Без цього - виняток Target [PaymentGateway] is not instantiable.
-
Скалярні параметри - ключ API, таймаут. Їх передають контекстною прив'язкою чи атрибутом
#[Config('services.stripe.key')]. -
Особливий спосіб створення або один екземпляр - клієнт з налаштуванням,
singleton()для дорогого об'єкта.
Порада: не реєструйте прив'язку для кожного класу «про всяк випадок». Конкретні класи контейнер створить сам, а зайві рядки в провайдері лише ускладнюють пошук того, що справді налаштовано.