{"id":352,"date":"2026-05-05T21:45:11","date_gmt":"2026-05-05T21:45:11","guid":{"rendered":"https:\/\/piotrswitlicki.pl\/?p=352"},"modified":"2026-05-05T21:46:26","modified_gmt":"2026-05-05T21:46:26","slug":"dependency-injection-w-laravel-co-to-jest-i-jak-tego-uzywac","status":"publish","type":"post","link":"https:\/\/piotrswitlicki.pl\/pl\/2026\/05\/05\/dependency-injection-w-laravel-co-to-jest-i-jak-tego-uzywac\/","title":{"rendered":"\ud83e\udde0 Dependency Injection w Laravel \u2014 co to jest i jak tego u\u017cywa\u0107?"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Dependency Injection (DI) to jeden z fundament\u00f3w nowoczesnego backendu w PHP i Laravelu.<\/h2>\n\n<p>Brzmi skomplikowanie, ale idea jest prosta:<\/p>\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>zamiast tworzy\u0107 zale\u017cno\u015bci wewn\u0105trz klasy \u2014 przekazujesz je z zewn\u0105trz<\/p>\n<\/blockquote>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\u274c Problem bez Dependency Injection<\/h2>\n\n<pre class=\"wp-block-code\"><code>class OrderService {<br>    public function process() {<br>        $payment = new StripePayment();<br>        $payment-&gt;pay(100);<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 problem:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>klasa jest \u201eprzyklejona\u201d do Stripe<\/li>\n\n\n\n<li>ci\u0119\u017cko testowa\u0107<\/li>\n\n\n\n<li>brak elastyczno\u015bci<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\u2705 Dependency Injection \u2014 rozwi\u0105zanie<\/h2>\n\n<pre class=\"wp-block-code\"><code>class OrderService {<br>    protected $payment;<br><br>    public function __construct(PaymentInterface $payment) {<br>        $this-&gt;payment = $payment;<br>    }<br><br>    public function process() {<br>        $this-&gt;payment-&gt;pay(100);<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 teraz:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>mo\u017cesz poda\u0107 dowoln\u0105 implementacj\u0119<\/li>\n\n\n\n<li>klasa nie wie <em>jak<\/em> dzia\u0142a p\u0142atno\u015b\u0107<\/li>\n\n\n\n<li>jest bardziej elastyczna<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 Jak dzia\u0142a to w Laravel?<\/h2>\n\n<p>Laravel ma wbudowany <strong>Service Container<\/strong>, kt\u00f3ry sam rozwi\u0105zuje zale\u017cno\u015bci.<\/p>\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad:<\/h3>\n\n<pre class=\"wp-block-code\"><code>class OrderController extends Controller {<br>    public function __construct(OrderService $orderService) {<br>        $this-&gt;orderService = $orderService;<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 Laravel automatycznie:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>tworzy <code>OrderService<\/code><\/li>\n\n\n\n<li>wstrzykuje zale\u017cno\u015bci<\/li>\n\n\n\n<li>zarz\u0105dza cyklem \u017cycia obiekt\u00f3w<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd25 Binding w Service Container<\/h2>\n\n<p>Cz\u0119sto u\u017cywasz interfejs\u00f3w:<\/p>\n\n<pre class=\"wp-block-code\"><code>interface PaymentInterface {<br>    public function pay(float $amount): void;<br>}<\/code><\/pre>\n\n<p>Implementacja:<\/p>\n\n<pre class=\"wp-block-code\"><code>class StripePayment implements PaymentInterface {<br>    public function pay(float $amount): void {<br>        \/\/ p\u0142atno\u015b\u0107<br>    }<br>}<\/code><\/pre>\n\n<h3 class=\"wp-block-heading\">Rejestracja w Laravel:<\/h3>\n\n<pre class=\"wp-block-code\"><code>app()-&gt;bind(PaymentInterface::class, StripePayment::class);<\/code><\/pre>\n\n<p>\ud83d\udc49 teraz Laravel wie:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>jak\u0105 klas\u0119 podstawi\u0107 pod interfejs<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Typy Dependency Injection<\/h2>\n\n<h3 class=\"wp-block-heading\">1. Constructor Injection (najcz\u0119stsze)<\/h3>\n\n<pre class=\"wp-block-code\"><code>public function __construct(Service $service)<\/code><\/pre>\n\n<p>\ud83d\udc49 najlepsza opcja w 90% przypadk\u00f3w<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h3 class=\"wp-block-heading\">2. Method Injection<\/h3>\n\n<pre class=\"wp-block-code\"><code>public function index(Service $service)<\/code><\/pre>\n\n<p>\ud83d\udc49 u\u017cywane np. w kontrolerach<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h3 class=\"wp-block-heading\">3. Setter Injection (rzadziej)<\/h3>\n\n<pre class=\"wp-block-code\"><code>public function setService(Service $service)<\/code><\/pre>\n\n<p>\ud83d\udc49 mniej popularne<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udd25 Realny przyk\u0142ad (Laravel)<\/h2>\n\n<pre class=\"wp-block-code\"><code>class ReportService {<br>    public function generate() {<br>        return \"raport\";<br>    }<br>}<br><br>class ReportController extends Controller {<br>    public function index(ReportService $reportService) {<br>        return $reportService-&gt;generate();<br>    }<br>}<\/code><\/pre>\n\n<p>\ud83d\udc49 Laravel sam wstrzyknie <code>ReportService<\/code><\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udca3 Dlaczego DI jest wa\u017cne?<\/h2>\n\n<p>\u2714 \u0142atwiejsze testowanie<br>\u2714 brak twardych zale\u017cno\u015bci<br>\u2714 lepsza architektura<br>\u2714 mo\u017cliwo\u015b\u0107 podmiany implementacji<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 TL;DR<\/h2>\n\n<ul class=\"wp-block-list\">\n<li>DI = przekazywanie zale\u017cno\u015bci zamiast tworzenia ich w klasie<\/li>\n\n\n\n<li>Laravel robi to automatycznie<\/li>\n\n\n\n<li>u\u017cywaj g\u0142\u00f3wnie constructor injection<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Podsumowanie<\/h2>\n\n<p>Dependency Injection to nie \u201epattern dla senior\u00f3w\u201d \u2014 to podstawowy spos\u00f3b pisania skalowalnego kodu.<\/p>\n\n<p>Je\u015bli u\u017cywasz Laravela i nie korzystasz z DI\u2026 to omijasz jedn\u0105 z jego najwi\u0119kszych zalet.<\/p>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-352","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/352","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/comments?post=352"}],"version-history":[{"count":2,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/352\/revisions"}],"predecessor-version":[{"id":354,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/352\/revisions\/354"}],"wp:attachment":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/media?parent=352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/categories?post=352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/tags?post=352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}