Ein Programmteil braucht fast immer andere Teile. Eine Verbindung zur Datenbank, einen Dienst zum Versenden von E-Mails, einen Zugang zu einem Fremdsystem. Die Frage ist, wie er daran kommt. Entweder er beschafft sie sich selbst, oder sie werden ihm beim Erzeugen übergeben. Das Zweite heißt Dependency Injection.
Der Unterschied klingt akademisch und hat sehr praktische Folgen. Wer sich seine Abhängigkeiten selbst holt, legt fest, welche es sind. Wer sie gereicht bekommt, akzeptiert alles, was die passende Form hat.
Was das konkret bringt
Zwei Dinge. Erstens Austauschbarkeit: Ein anderer Anbieter für Versand oder Zahlung wird an einer Stelle eingetragen, statt an dreißig Stellen im Code gesucht.
Zweitens Prüfbarkeit. In einem automatisierten Test will man keine echten E-Mails verschicken und kein echtes Fremdsystem anrufen. Werden die Abhängigkeiten gereicht, setzt der Test einfach einen Ersatz ein. Werden sie selbst geholt, bleibt oft nur, den Test wegzulassen.
Zusammengesetzt wird das in Laravel vom Service Container, der weiß, wie jeder Dienst zu erzeugen ist.