• Czas czytania ~4 min
  • 29.02.2024

Termin "Kontener" jest jednym z najczęściej używanych terminów w frameworku Laravel. Ale nie zawsze dla wszystkich jest jasne, co to jest i jak działa. W tym wpisie postaram się wyjaśnić koncepcję kontenera na przykładzie z życia wziętym.

Analogia

do kawiarni Wyobraź sobie, że jesteś w kawiarni, miejscu, w którym możesz zamówić różne napoje kawowe. Kawiarnia pełni funkcję kontenera usługowego. Kiedy zamawiasz kawę, powiedzmy cappuccino, nie musisz wiedzieć, jak zrobić ją sam; Po prostu mówisz bariście, czego chcesz, a on przygotowuje to dla Ciebie, korzystając z zasobów kawiarni (ziarna kawy, mleko, ekspresy do kawy itp.).

W tej analogii:

  • Kawiarnia (kontener usługowy): Jest to miejsce, w którym dostępne są wszystkie zasoby (usługi). Wie, jak przygotować każdy zamówiony napój kawowy (usługę).
  • Barista (resolwer usług): Działa jako mechanizm w kawiarni, który rozumie Twoje zamówienie i wie, jak je zrealizować, korzystając z zasobów dostępnych w sklepie.
  • Napoje kawowe (usługi): Są to różne usługi oferowane przez kawiarnię, takie jak cappuccino, latte lub espresso. Każdy napój wymaga określonego procesu i zasobów do przygotowania.

Stosując analogię do tworzenia

oprogramowania, przekładając to z powrotem na tworzenie oprogramowania:

  • Kontener serwisowy: Jest to potężne narzędzie w frameworku (takim jak Laravel), które zarządza tworzeniem i dystrybucją usług (obiektów). Wie, jak tworzyć instancje i konfigurować obiekty na podstawie żądań.
  • Usługi: Są to klasy i obiekty, które wykonują określone zadania w aplikacji, takie jak wysyłanie wiadomości e-mail, rejestrowanie komunikatów lub obsługa interakcji z bazą danych.
  • Usługi rozwiązywania problemów: Kiedy zamawiasz konkretną usługę z kontenera, to tak, jakbyś zamawiał kawę. Nie musisz wiedzieć, jak usługa jest skonstruowana ani skonfigurowana; Kontener zajmie się tym za Ciebie i zapewni gotową do użycia usługę.

Dlaczego warto korzystać z kontenera usługowego?

  • Uproszczenie: Tak jak nie musisz wiedzieć, jak przygotować każdy rodzaj napoju kawowego, tak nie musisz ręcznie zarządzać tworzeniem i konfiguracją obiektów w swojej aplikacji.
  • Elastyczność: Możesz łatwo zmienić sposób świadczenia usługi bez zmiany kodu, który jej używa, podobnie jak kawiarnia może zmienić swoją recepturę lub składniki bez wpływu na sposób zamawiania napoju.
  • Sprawność: Kontener może zarządzać udostępnionymi zasobami, takimi jak pojedyncze połączenie z bazą danych, z którego korzysta wiele części aplikacji, podobnie jak kawiarnia używa jednego ekspresu do kawy do przygotowywania różnych napojów.

Dość teorii. Napiszmy teraz trochę kodu.

Napisz kontener w projekcie

PHP Zdefiniuj rodzaje kawy (usługi)

Najpierw zdefiniujmy kilka klas, które reprezentują różne rodzaje napojów kawowych. Zajęcia te będą miały metodę opisującą sposób podawania napoju.

interface Coffee {
    public function serve();
}
class Espresso implements Coffee {
    public function serve() {
        return "Serving an Espresso.\n";
    }
}
class Cappuccino implements Coffee {
    public function serve() {
        return "Serving a Cappuccino with frothy milk.\n";
    }
}
class Latte implements Coffee {
    public function serve() {
        return "Serving a Latte with steamed milk.\n";
    }
}

Zaimplementuj CoffeeShop (Service Container)

Teraz utworzymy klasęCoffeeShop, która będzie działać jako nasz kontener usługowy. Będzie miał możliwość rejestrowania rodzajów kawy i ich serwowania.

class CoffeeShop {
    protected $recipes = [];
    
    // Register a coffee type
    public function register($coffeeName, Callable $make) {
        $this->recipes[$coffeeName] = $make;
    }
    // Serve a coffee based on the registered recipe
    public function serve($coffeeName) {
        if (!isset($this->recipes[$coffeeName])) {
            return "Sorry, we don't serve $coffeeName.\n";
        }
        
        $coffee = call_user_func($this->recipes[$coffeeName]);
        return $coffee->serve();
    }
}

Zarejestruj rodzaje kawy i podawaj je Na

koniec zarejestrujemy każdy rodzaj kawy w kawiarni, a następnie poprosimy ją o podanie różnych napojów.

// Create the coffee shop (service container)
$coffeeShop = new CoffeeShop();
// Register coffee types (services)
$coffeeShop->register('espresso', function() { return new Espresso(); });
$coffeeShop->register('cappuccino', function() { return new Cappuccino(); });
$coffeeShop->register('latte', function() { return new Latte(); });
// Serve the coffee
echo $coffeeShop->serve('espresso');
echo $coffeeShop->serve('cappuccino');
echo $coffeeShop->serve('latte');
echo $coffeeShop->serve('mocha'); // This should return an error message

Podsumowanie

Serving an Espresso.
Serving a Cappuccino with frothy milk.
Serving a Latte with steamed milk.
Sorry, we don't serve mocha.

wyjściowe

Zasadniczo kontener usług w tworzeniu oprogramowania abstrahuje od złożoności tworzenia obiektów usług i zarządzania nimi, umożliwiając programistom skupienie się na funkcjonalności wyższego poziomu ich aplikacji. Tak jak kawiarnia efektywnie dostarcza różnorodne napoje bez konieczności znajomości szczegółów ich wytwarzania, tak kontener serwisowy upraszcza zarządzanie obiektami serwisowymi i ich zależnościami w aplikacji.

Jeśli jesteś wzrokowcem, możesz obejrzeć ten film:

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297