Термин «Контейнер» является одним из наиболее часто используемых терминов во фреймворке 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.
Заключение
По сути, сервисный контейнер в разработке программного обеспечения абстрагирует сложности создания и управления объектами сервиса, позволяя разработчикам сосредоточиться на высокоуровневой функциональности своего приложения. Точно так же, как кофейня эффективно предоставляет вам разнообразные напитки, не требуя от вас знания подробностей о том, как каждый из них готовится, сервисный контейнер упрощает управление объектами обслуживания и их зависимостями в приложении.
Если вы визуал, вы можете посмотреть это видео: