Wzorzec Fasada w PHP - Praktyczne zastosowanie

31.07.2025

Wzorzec projektowy Fasada w PHP 8.4

Standard Fasada (Facade) to wzorzec strukturalny, który upraszcza interfejs skomplikowanego systemu. Dzięki niemu możesz udostępnić jedną, spójną klasę do wykonywania różnych operacji, ukrywając szczegóły implementacji.

Dlaczego wzorzec Fasada jest ważny?

  • Upraszcza pracę ze złożonymi systemami poprzez ukrycie szczegółów implementacji,
  • Redukuje zależności między kodem klienta a skomplikowanymi podsystemami,
  • Ułatwia migrację i refaktoryzację - zmiany w podsystemach nie wpływają na klientów,
  • Poprawia testowalność poprzez dostarczenie jednolitego punktu wejścia.

Kluczowe cechy wzorca Fasada

  • Pojedynczy punkt dostępu - jedna klasa jako interfejs do całego podsystemu,
  • Ukrycie złożoności - szczegóły implementacji niewidoczne dla klienta,
  • Luźne powiązanie - minimalizacja zależności między komponentami,
  • Delegacja odpowiedzialności - fasada przekazuje wywołania do odpowiednich klas.

Jak działa wzorzec Fasada?

Wzorzec projektowy Fasada (Facade) umożliwia uproszczenie interfejsu skomplikowanego systemu, udostępniając jedną spójną klasę do wykonywania różnych operacji. Klasa QueryBuilder z 8. rozdziału ebooka „DBAL - query builder" doskonale obrazuje ten wzorzec. Dzięki zastosowaniu fasady programiści mogą w łatwy sposób generować różne rodzaje zapytań do bazy danych – bez konieczności zagłębiania się w szczegóły implementacji poszczególnych klas odpowiedzialnych za budowanie konkretnych zapytań.

W omawianym przykładzie klasa QueryBuilder dostarcza wygodne metody, takie jak insert(), update(), delete() oraz select(), które odpowiadają za tworzenie i przygotowywanie konkretnych typów zapytań SQL. Każda z tych metod wewnętrznie ukrywa szczegóły pozyskiwania właściwych obiektów budujących zapytania z kontenera aplikacji (Application::getInstance()->get()), ich oczyszczania oraz konfiguracji. W ten sposób fasada znacząco zmniejsza złożoność kodu, z którą musiałby się mierzyć użytkownik, bez jej zastosowania

<?php

declare(strict_types=1);

namespace DJWeb\Framework\DBAL\Query\Builders;

use DJWeb\Framework\Base\Application;
use DJWeb\Framework\DBAL\Contracts\Query\DeleteQueryBuilderContract;
use DJWeb\Framework\DBAL\Contracts\Query\InsertQueryBuilderContract;
use DJWeb\Framework\DBAL\Contracts\Query\QueryBuilderFacadeContract;
use DJWeb\Framework\DBAL\Contracts\Query\SelectQueryBuilderContract;
use DJWeb\Framework\DBAL\Contracts\Query\UpdateQueryBuilderContract;

class QueryBuilder implements QueryBuilderFacadeContract
{
    public function insert(string $table): InsertQueryBuilderContract
    {
        /** @var InsertQueryBuilderContract $item */
        $item = Application::getInstance()->get(InsertQueryBuilderContract::class);
        $item->clean();
        return $item->table($table);
    }

    public function update(string $table): UpdateQueryBuilderContract
    {
        /** @var UpdateQueryBuilderContract $item */
        $item = Application::getInstance()->get(UpdateQueryBuilderContract::class);
        $item->clean();
        return $item->table($table);
    }

    public function delete(string $table): DeleteQueryBuilderContract
    {
        /** @var DeleteQueryBuilderContract $item */
        $item = Application::getInstance()->get(DeleteQueryBuilderContract::class);
        $item->clean();
        return $item->table($table);
    }

    public function select(string $table): SelectQueryBuilderContract
    {
        /** @var SelectQueryBuilderContract $item */
        $item = Application::getInstance()->get(SelectQueryBuilderContract::class);
        $item->clean();
        return $item->table($table);
    }
}

Warto zauważyć, że w przedstawionym przykładzie klasy QueryBuilder z rozdziału 8 ebooka „DBAL - query builder" wykorzystano dobrą praktykę polegającą na zwracaniu interfejsów (InsertQueryBuilderContract, UpdateQueryBuilderContract itd.), a nie konkretnych klas. Dzięki temu implementacja fasady zachowuje wysoki poziom abstrakcji i nie narzuca użytkownikowi sztywnych powiązań z konkretnymi klasami. Klient klasy fasady może programować do interfejsów, co zwiększa elastyczność oraz ułatwia testowanie aplikacji.

🎓 Chcesz poznać więcej wzorców projektowych?

Ten wpis to fragment kompleksowego kursu PHP 8.4, w którym szczegółowo omawiam wszystkie wzorce projektowe wraz z praktycznymi przykładami z rzeczywistych projektów.

Kup pełny kurs PHP 8.4 🚀 Pobierz darmowy fragment 📥

Zobacz też inne wzorce projektowe