• Час читання ~1 хв
  • 29.02.2024

Термін «контейнер» є одним із найбільш використовуваних термінів у фреймворку Laravel. Але не завжди всім зрозуміло, що це таке і як працює. У цьому пості я спробую пояснити концепцію контейнера на прикладі з життя.

Аналогія

з кав'ярнею Уявіть, що ви перебуваєте в кав'ярні, місці, де можна замовити різноманітні кавові напої. Кав'ярня виконує роль сервісної ємності. Коли ви замовляєте каву, скажімо, капучино, вам не потрібно знати, як приготувати її самостійно; Ви просто говорите бариста, що хочете, а вони готують це для вас, використовуючи ресурси кав'ярні (кавові зерна, молоко, еспресо-машини тощо).

За цією аналогією:

  • Кав'ярня (сервісний контейнер): Саме тут доступні всі ресурси (послуги). Він знає, як приготувати будь-який кавовий напій (послугу), який ви замовите.
  • Бариста (Service Resolver): Діє як механізм всередині кав'ярні, який розуміє ваше замовлення і знає, як його виконати, використовуючи наявні в магазині ресурси.
  • Кавові напої (послуги): Це різноманітні послуги, які пропонує кав'ярня, як-от капучино, латте чи еспресо. Кожен напій вимагає певного процесу та ресурсів для виготовлення.

Застосування аналогії до розробки

програмного забезпечення Перенесіть це назад на розробку програмного забезпечення:

  • Сервісний контейнер: Це потужний інструмент у фреймворку (на кшталт Laravel), який керує створенням та розповсюдженням сервісів (об'єктів). Він знає, як створювати екземпляри та налаштовувати об'єкти на основі ваших запитів.
  • Послуги: Це класи та об'єкти, які виконують конкретні завдання у вашій програмі, такі як надсилання електронних листів, ведення журналу повідомлень або обробка взаємодії з базою даних.
  • Послуги з вирішення: Коли ви замовляєте певну послугу з контейнера, це все одно, що замовляти каву. Вам не потрібно знати, як побудований або налаштований сервіс; Контейнер зробить це за вас і надасть готовий до використання сервіс.

Навіщо використовувати сервісний контейнер?

  • Спрощення: Так само, як вам не потрібно знати, як приготувати кожен тип кавового напою, вам не потрібно вручну керувати створенням і конфігурацією об'єктів у вашому додатку.
  • Гнучкість: Ви можете легко змінити спосіб надання послуги, не змінюючи код, який її використовує, подібно до того, як кав'ярня може змінити свій рецепт або інгредієнти, не впливаючи на те, як ви замовляєте напій.
  • Ефективність: Контейнер може керувати спільними ресурсами, як-от єдиним з'єднанням до бази даних, яке використовується багатьма частинами вашої програми, подібно до того, як кав'ярня використовує одну еспресо-машину для приготування різних напоїв.

Досить теорії. Давайте зараз напишемо код.

Написати контейнер в PHP-проекті

Визначте типи кави (послуги)

Для початку визначимо кілька класів, які представляють різні види кавових напоїв. На цих заняттях буде метод, що описує, як подавати напій.

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";
    }
}

Реалізація CoffeeShop (Service Container)

Тепер ми створимо CoffeeShop клас, який виконує роль нашого сервіс-контейнера. У ньому буде можливість реєструвати сорти кави та подавати їх.

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();
    }
}

Зареєструйте види кави та подавайте їх

Нарешті, ми зареєструємо кожен тип кави в кав'ярні, а потім попросимо її подавати різні напої.

// 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

Висновок

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

Висновок

По суті, сервіс-контейнер у розробці програмного забезпечення абстрагує складнощі створення та управління об'єктами обслуговування, дозволяючи розробникам зосередитися на більш високорівневій функціональності свого застосування. Подібно до того, як кав'ярня ефективно забезпечує вас різноманітними напоями, не вимагаючи від вас знання деталей про те, як кожен з них виготовляється, контейнер для обслуговування спрощує управління об'єктами обслуговування та їх залежностями у вашому застосуванні.

Якщо ви навчаєтеся візуально, ви можете поглянути на це відео:

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297