Praktyczny kurs PHP Dependency Injection – Zrozumienie i zastosowanie

Wprowadzenie do wstrzykiwania zależności

Wstrzykiwanie zależności (ang. Dependency Injection) to technika programistyczna, która polega na przekazywaniu potrzebnych zależności do obiektów zamiast tworzenia ich wewnątrz obiektu. Jest to jeden z najważniejszych wzorców projektowych w programowaniu obiektowym, który pozwala na zwiększenie elastyczności i łatwości testowania kodu. Dzięki wstrzykiwaniu zależności, kod staje się bardziej modularny, co ułatwia jego rozwijanie i utrzymanie. W praktyce oznacza to, że obiekty nie są odpowiedzialne za tworzenie swoich zależności, co prowadzi do luźniejszych powiązań między klasami i lepszej organizacji kodu.

Czym jest Dependency Injection?

Dependency Injection (DI) to wzorzec projektowy, który pozwala na luźne powiązania między klasami, eliminując konieczność ręcznego tworzenia zależności wewnątrz obiektów. Dzięki temu kod staje się modularny, łatwiejszy w testowaniu i bardziej elastyczny.

W tradycyjnym podejściu, klasa sama tworzy swoje zależności, dobry przykład użycia to klasa do obsługi bazy danych:

public function __construct() {
                $this->database = new DatabaseConnection();
                }

Jednak taka konstrukcja sprawia, że zmiana sposobu działania DatabaseConnection wymaga edycji UserService, co łamie zasadę odwrócenia zależności (D w SOLID). Dzięki wykorzystaniu kontenera wszystkie potrzebne zależności zostaną automatycznie znalezione, niezależnie od tego czy jako klucz w kontenerze używamy interfejsu czy nazwy klasy. Co więcej, DI może zredukować liczbę nowych połączeń tworzonych za każdym razem, gdy wysyłana jest wiadomość e-mail, co zwiększa efektywność i oszczędność zasobów w aplikacjach webowych

readonly class UserService
                {
                public function __construct(private DatabaseConnection $database) {}
                }

Jak działa Dependency Injection w PHP?

W moim kursie PHP uczysz się, jak profesjonalnie zarządzać zależnościami w aplikacji. Dependency Injection (DI) to kluczowy wzorzec, który pozwala na czystszy i bardziej modularny kod. W odróżnieniu od klasycznego podejścia, gdzie obiekty tworzą swoje zależności, tutaj kontrolę przejmuje kontener DI, który dynamicznie dostarcza instancje klas tam, gdzie są potrzebne.

W moim rozwiązaniu korzystam z Container, który działa jak inteligentny rejestr usług, przechowując obiekty w strukturze notacji kropkowej (DotContainer). Dzięki temu możesz wygodnie zarządzać konfiguracją, np. ustawiając database.host czy mailer.smtp, a następnie pobierając te wartości w dowolnym miejscu aplikacji. To sprawia, że kod staje się bardziej czytelny i elastyczny.

Największym atutem DI w moim kursie PHP jest Autowire, czyli system, który samodzielnie analizuje klasy i automatycznie rozwiązuje ich zależności. Dzięki Reflection API, kontener DI sprawdza konstruktor klasy i dostarcza odpowiednie obiekty – bez potrzeby ręcznego ich definiowania. W efekcie Twoja aplikacja jest nie tylko lepiej zorganizowana, ale też gotowa na skalowanie i łatwa w testowaniu.

Jeśli chcesz poznać nowoczesne techniki Dependency Injection, nauczyć się korzystać z PSR-11, kontenerów DI i autowiringu, sprawdź mój kurs PHP! Dzięki praktycznym przykładom szybko opanujesz profesjonalne zarządzanie zależnościami, co pozwoli Ci tworzyć czysty i wydajny kod.

Czym jest i jak działa notacja kropkowa?

W moim kursie PHP poznasz notację kropkową, która jest wygodnym sposobem na organizowanie i pobieranie danych w aplikacji. Zamiast używać wielowymiarowych tablic i odwoływać się do wartości w zagnieżdżonej strukturze ($config['database']['host']), można zapisywać i odczytywać dane w postaci pojedynczego stringa:

$config->set('database.host', 'localhost');
                echo $config->get('database.host'); // localhost

W moim kontenerze DI zastosowałem notację kropkową w DotContainer, dzięki czemu można organizować zależności w prosty sposób i dynamicznie je odczytywać. To rozwiązanie sprawia, że kod w Twojej aplikacji jest bardziej modularny i elastyczny, podobnie jak w dużych frameworkach takich jak Laravel

<?php

declare(strict_types=1);

namespace DJWeb\Framework\Base;

use ArrayObject;

class DotContainer extends ArrayObject
{
    private readonly ArrayGet $arrayGet;
    private readonly ArraySet $arraySet;

    /**
     * @param array<int|string, mixed> $array
     */
    public function __construct(array $array = [])
    {
        parent::__construct($array);
        $this->arrayGet = new ArrayGet($this);
        $this->arraySet = new ArraySet($this);
    }

    public function get(string $key, mixed $default = null): mixed
    {
        return $this->arrayGet->get($key, $default);
    }

    public function set(string $key, mixed $default = null): void
    {
        $this->arraySet->set($key, $default);
    }

    public function has(string $key): bool
    {
        return $this->arrayGet->get($key) !== null;
    }
}

Jakie korzyści daje Autowire i jak działa bind w kontenerze DI?

W moim kursie PHP uczysz się, jak Autowire automatycznie wstrzykuje zależności bez konieczności ręcznego definiowania ich w kodzie. Dzięki wykorzystaniu Reflection API, kontener DI sam analizuje konstruktor klasy i dostarcza jej odpowiednie instancje, co sprawia, że kod jest czystszy, bardziej skalowalny i łatwiejszy w utrzymaniu

Lepsza organizacja kodu i mniejsze powiązania między klasami – zasady SOLID w praktyce

Dependency Injection to nie tylko wygoda, ale także zgodność z zasadami SOLID, które są fundamentem dobrze zaprojektowanego kodu. Stosując settery, można w łatwy sposób skonfigurować zależności. W moim kursie PHP uczysz się, jak stosować SOLID w połączeniu z kontenerem DI, co sprawia, że Twoje aplikacje są modularne, łatwe w testowaniu i gotowe na skalowanie.

Praktyczne przykłady użycia Dependency Injection

Wstrzykiwanie zależności jest często stosowane wraz z inżynierią wstrzyknięcia, która polega na przekazywaniu zależności w strukturze aplikacji. Przykładem wstrzykiwania zależności jest przekazywanie instancji klienta S3 do klasy, która go używa. Zamiast tworzyć instancję klienta S3 wewnątrz klasy, możemy ją przekazać jako zależność. Dzięki temu podejściu, klasa FileUploader nie jest bezpośrednio zależna od konkretnej implementacji klienta S3, co pozwala na łatwiejsze testowanie i modyfikowanie kodu.

class FileUploader
{
    public function __construct(private readonly S3ClientContract $s3Client)    {    }
    public function upload(string $filePath): bool
    {
        $this->client->upload($filePath);
        return true;
    }
}

Chcesz zobaczyć więcej praktycznych przykładów? Pobierz darmowy fragment ebooka 📥 lub Kup kurs php 🎓

Wzorce projektowe wspierające Dependency Injection

Wzorce projektowe odgrywają kluczową rolę w ułatwianiu i optymalizowaniu stosowania Dependency Injection w projektach programistycznych. Jednym z najbardziej znaczących wzorców jest „Fabryka Abstrakcyjna” (Abstract Factory), który pozwala na tworzenie rodzin powiązanych obiektów bez określania ich konkretnych klas. Wzorzec „Budowniczy” (Builder) umożliwia skonstruowanie złożonego obiektu krok po kroku, co jest szczególnie przydatne w przypadku obiektów z wieloma zależnościami. „Singleton”, choć kontrowersyjny w kontekście DI, może być wykorzystywany do zarządzania unikalnymi instancjami obiektów, zapewniając, że w całej aplikacji istnieje tylko jedna instancja danego obiektu.

Jak Dependency Injection Container pomaga w uruchamianiu testów jednostkowych?

W moim kursie PHP uczysz się, jak Dependency Injection Container (DI Container) ułatwia pisanie testów jednostkowych. Kluczowym problemem w testowaniu jest zależność klas od konkretnych implementacji – DI eliminuje ten problem, pozwalając na łatwe podmienianie obiektów na mocki.

Bez Dependency Injection: Każda klasa samodzielnie tworzy swoje zależności, co sprawia, że testowanie jest trudne - konstruktor tej klasy musi ręcznie stworzyć całą bazę danych

class UserService {
    private DatabaseConnection $db;

    public function __construct()
    {
        $this->db = new DatabaseConnection(); // Testowanie wymaga prawdziwej bazy!
    }
}

Z Dependency Injection: W teście poniżej widzimy dependency injection container do testów jednostkowych dla bazy danych mysql. Użycie funkcji $this->createMock pozwala wykonać testy bez fizycznego uruchamiania bazy danych

<?php

namespace Tests\DBAL\Connection;

use DJWeb\Framework\Base\Application;
use DJWeb\Framework\Config\Contracts\ConfigContract;
use DJWeb\Framework\DBAL\Connection\MySqlConnection;
use PDO;
use PDOException;
use PDOStatement;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\BaseTestCase;

class MySqlConnectionTest extends BaseTestCase
{
    private MySqlConnection|MockObject $connection;
    private $applicationMock;

    public function testConnect(): void
    {
        $this->mockConfig();
        $pdoMock = $this->createMock(PDO::class);

        $this->connection = $this->getMockBuilder(MySqlConnection::class)
            ->onlyMethods(['connectMysql'])
            ->getMock();
        $this->connection->expects($this->once())
            ->method('connectMysql')
            ->willReturn($pdoMock);

        $this->connection->connect();
        $pdo = $this->connection->getConnection();

        // Call connect again to ensure it doesn't try to reconnect
        // and return the same instance of PDO
        $this->connection->connect();
        $pdo2 = $this->connection->getConnection();
        $this->assertSame($pdo, $pdo2);
    }
}

PSR i Dependency Injection

Standardy PSR (PHP Standards Recommendations) są ważne dla programistów PHP, ponieważ ułatwiają tworzenie kodu, który jest bardziej czytelny, łatwiejszy w utrzymaniu i testowaniu. Wstrzykiwanie zależności jest jednym z najważniejszych aspektów PSR, ponieważ pozwala na zwiększenie elastyczności i łatwości testowania kodu. Standard PSR-11 określa interfejs kontenera zależności w PHP, który jest kluczowy dla wstrzykiwania zależności. Dzięki PSR-11, programiści mogą tworzyć kontenery DI, które są zgodne z najlepszymi praktykami i łatwe do integracji z różnymi frameworkami i bibliotekami.

Najczęstrze pytania o dependency injection

Co da mi użycie dependency injection w moim projekcie?
Dependency Injection pozwala na lepszą organizację kodu, eliminację sztywnych zależności oraz łatwiejsze zarządzanie obiektami w aplikacji. Dzięki temu Twój projekt staje się bardziej modularny, a każda klasa pełni jedno, dobrze określone zadanie. W praktyce oznacza to, że możesz łatwiej rozwijać aplikację bez ryzyka wprowadzania błędów w istniejących modułach.
Jakie są korzyści stosowania Dependency Injection?
Jedną z największych zalet DI jest skalowalność kodu, ponieważ pozwala na dynamiczne zarządzanie zależnościami bez potrzeby ręcznej modyfikacji każdej klasy. Ułatwia również testowanie jednostkowe, ponieważ można w prosty sposób podmieniać zależności na mocki. Dodatkowo poprawia organizację struktury aplikacji, ponieważ separuje logikę biznesową od procesu tworzenia obiektów, co prowadzi do czytelniejszego i bardziej elastycznego kodu.
Dlaczego warto poznać Dependency Injection?
Współczesne aplikacje PHP bazują na zasadzie luźnych powiązań między komponentami, co sprawia, że Dependency Injection staje się standardem. Dzięki temu możesz stosować Test Driven Development, co pozwala pisać kod w sposób zorientowany na testy. DI ułatwia również mockowanie w testach, co znacząco skraca czas debugowania. Przejrzysta struktura kodu, eliminacja sztywnych zależności i lepsza organizacja aplikacji sprawiają, że DI jest fundamentem nowoczesnych aplikacji PHP.
Jakie technologie i narzędzia poznasz?
Ebook w kompleksowy sposób przedstawia Symfony Dependency Injection, czyli mechanizm wstrzykiwania zależności w jednym z najpopularniejszych frameworków PHP. Omówione zostaną również narzędzia wspierające jakość kodu, takie jak phpinsights. Dodatkowo, dowiesz się, jak stosować zaawansowane wzorce projektowe, które poprawiają organizację kodu i czynią go bardziej elastycznym oraz czytelnym.
Dla kogo jest ta publikacja?
Kurs skierowany jest do programistów PHP ze średniozaawansowaną znajomością programowania obiektowego, którzy chcą podnieść swoje umiejętności i pisać kod zgodnie z najlepszymi standardami. Jest to również świetny materiał dla developerów pragnących lepiej zrozumieć architekturę aplikacji oraz tych, którzy chcą nauczyć się profesjonalnego projektowania oprogramowania z wykorzystaniem Dependency Injection i wzorców projektowych.
Jakie umiejętności zdobędę?
Po ukończeniu kursu będziesz potrafił stosować Dependency Injection w codziennej pracy, co pozwoli Ci na projektowanie bardziej elastycznych i modularnych systemów. Nauczysz się, jak tworzyć aplikacje łatwe w utrzymaniu, w których zarządzanie zależnościami jest przejrzyste i efektywne. Dzięki zastosowaniu Dependency Injection Twój kod stanie się bardziej czytelny i zrozumiały dla innych programistów, co ułatwi pracę w

Zamów praktyczny kurs PHP już teraz!

Dowiedz się jak działają współczesne frameworki PHP

cover

Kup teraz 149 zł

Nasz kurs PHP w praktyce to inwestycja w Twoją karierę. Po zakupie zyskasz:

checkmark Pełny dostęp do materiałów kursu

checkmark Możliwość czytania e-booka online

checkmark Przeglądarkę kodu źródłowego z praktycznymi przykładami

checkmark Możliwość pobrania w formatach PDF/EPUB/Markdown