• Время чтения ~1 мин
  • 29.02.2024

Термин «Контейнер» является одним из наиболее часто используемых терминов во фреймворке Laravel. Но не всем понятно, что это такое и как работает. В этом посте я попытаюсь объяснить концепцию контейнера на примере из реальной жизни.

Аналогия

с кофейней Представьте, что вы находитесь в кофейне, месте, где вы можете заказать различные кофейные напитки. Кофейня выступает в роли сервисного контейнера. Когда вы заказываете кофе, скажем, капучино, вам не нужно знать, как приготовить его самостоятельно; Вы просто говорите бариста, что хотите, и он готовит это для вас, используя ресурсы кофейни (кофейные зерна, молоко, эспрессо-машины и т. д.).

В этой аналогии:

  • Кофейня (сервисный контейнер): Именно здесь доступны все ресурсы (сервисы). Он знает, как приготовить любой кофейный напиток (услугу), который вы заказываете.
  • Бариста (Service Resolver): Действует как механизм внутри кофейни, который понимает ваш заказ и знает, как его выполнить, используя ресурсы, доступные в магазине.
  • Кофейные напитки (услуги): Это различные услуги, которые предлагает кофейня, такие как капучино, латте или эспрессо. Для приготовления каждого напитка требуется определенный процесс и ресурсы.

Применение аналогии к разработке

программного обеспечения Переводя это обратно на разработку программного обеспечения:

  • Сервисный контейнер: Это мощный инструмент во фреймворке (например, Laravel), который управляет созданием и распространением сервисов (объектов). Он знает, как создавать экземпляры и настраивать объекты на основе ваших запросов.
  • Услуги: Это классы и объекты, которые выполняют определенные задачи в приложении, такие как отправка электронной почты, регистрация сообщений или обработка взаимодействий с базой данных.
  • Услуги по разрешению проблем: Когда вы заказываете конкретную услугу из контейнера, это похоже на заказ кофе. Вам не нужно знать, как устроен или настроен сервис; Контейнер обрабатывает его за вас и предоставляет готовую к использованию услугу.

Зачем использовать контейнер служб?

  • Упрощение: Точно так же, как вам не нужно знать, как приготовить каждый тип кофейного напитка, вам не нужно вручную управлять созданием и настройкой объектов в вашем приложении.
  • Гибкость: Вы можете легко изменить способ предоставления услуги, не изменяя код, который ее использует, подобно тому, как кофейня может изменить свой рецепт или ингредиенты, не влияя на то, как вы заказываете напиток.
  • Эффективность: Контейнер может управлять общими ресурсами, такими как единое подключение к базе данных, используемое многими частями приложения, подобно тому, как кофейня использует одну эспрессо-машину для приготовления различных напитков.

Хватит теории. Давайте теперь напишем код.

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

Define Coffee Types (Services)Для

начала давайте определим несколько классов, представляющих различные типы кофейных напитков. На этих занятиях будет описано, как подавать напиток.

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