Kategorie
PHP Wzorce projektowe

Praktyczny przykład fabryki

Praktycznie wykorzystanie fabryki jako mechanizmu do zarządzania danymi w bazie danych.

Fabryka to jeden z popularniejszych wzorców projektowych. W sieci znajdziemy wiele możliwości implementacji i sposób jego wykorzystania. Operacje bazodanowe w aplikacjach internetowych to częste działanie, dlatego opracowanie uniwersalnej koncepcji zarządzania rekordami czy całymi kolekcjami danych jest przydatne. Taki scenariusz dobrze rozwiązuje właśnie wzorzec projektowy – Fabryka.

Klasa Dao (ang. Data Access Object), nazwa może nie jest do końca właściwa, ale w tym wypadku chodzi o prostą koncepcję, która obejmuje najczęstsze przypadki. Podczas obsługi żądań w aplikacji zmieniamy stan bazy lub szukamy określonych danych. Do zarządzania pojedynczymi wpisami (dodawanie, edycja, usuwanie) tworzymy rodzinę encji (ang. Entities), które przechowują stan danego wiersza z tabeli w bazie. Kolekcje encji, choć tutaj tylko wielu wpisów z bazy potraktujemy jako listingi, także z angielskiego.

Kod źródłowy

Poniżej znajduje się prosty przykład klasy, która jako fabryka tworzy obiekty danej rodziny, w tym wypadku encji lub listingów.

<?php

class Dao {
    
    public static function entity($sName, $mIdentifier = 0, $sIdLabel = null) {
        if (file_exists(DAO_DIR.'/entities/'.$sName.'Entity.php')) {
            require_once DAO_DIR.'/entities/'.$sName.'Entity.php';
            $sEntity = $sName.'Entity';
        } else {
            require_once LIB_DIR.'/Entity.php';
            $sEntity = 'Entity';
        }
        return new $sEntity($mIdentifier, $sIdLabel);
    }
    
    public static function listing($sName) {
        if (file_exists(DAO_DIR.'/listings/'.$sName.'Listing.php')) {
            require_once DAO_DIR.'/listings/'.$sName.'Listing.php';
            $sListing = $sName.'Listing';
        } else {
            require_once LIB_DIR.'/Listing.php';
            $sListing = 'Listing';
        }
        return new $sListing($sName);
    }

}
?>

Uniwersalna klasa zawiera dwie statyczne metody. Pierwsza Dao::entity() tworzy obiekt encji danego typu. Pusta encja idealnie nadaje się do utworzenia nowego wpisu w bazie, poprzez dane formularza i wywołanie metody insert() lub jakiejkolwiek innej i uruchomienie zapytania do bazy. Encja wypełniona danymi modyfikuje stan bazy, jeśli uruchomisz metodę update().

Listing operuje na większej ilości danych. Mimo, że jego głównym celem jest wyświetlanie informacji, możliwe jest masowe usuwanie lub masowa aktualizacja wpisów, właśnie przez przekazanie listingu zamiast usuwanie encji w pętli.

Podsumowanie

Przedstawiony przykład to tylko prosty wariant dla zorganizowania schematycznych i banalnych czynności. Każdorazowe dołączanie definicji encji czy listingu do plików widoku jest mało elastyczne. Rozwiązaniem jest albo automatyczne ładowanie klas, albo wykorzystanie fabryki, która tworzy obiekty na podstawie konwencji nazw. Każdy pomysł jest warty rozważenia, jeśli usprawnia Twój i umożliwia jego ponowne wykorzystanie.