Предположим, у вас есть Бар класс, который использует BasicLogger.
У вас есть несколько способов получить доступ к регистратору, позволяет начать с наиболее простым вариантом:
<?php
class Bar
{
public function bar()
{
$logger = new BasicLogger();
$logger->log("foo");
}
}
Это плохая практика, потому что мы смешиваем строительство логику с логикой приложения. Он по-прежнему работает, но имеет следующие недостатки:
- Он смешивает обязанности.
- Бар становится трудно тестировать и не может быть протестирован без побочных эффектов.
- Мы не можем динамически изменять регистраторы (код менее многоразовый).
Для решения этих недостатков, мы можем вместо этого требуют нашего Logger класса через конструктор.
Наш код теперь выглядит следующим образом:
class Bar
{
private $logger;
public function __construct(Logger $logger)
{
$this->logger = $logger;
}
public function bar()
{
$this->logger->log("foo");
}
}
Великий, наш класс больше не отвечает за создание регистратора, мы можем проверить наш код без побочных эффектов (и сделать утверждения против как был использован регистратор) и теперь мы можем использовать любой регистратор, который нам нравится.
Итак, теперь мы используем наш новый класс по всему приложению.
$logger = new Logger();
$bar = new Bar($logger);
Посмотрите знакомы? Снова мы смешиваем логику построения с логикой приложения, о которой мы уже знаем, плохо.
Не только это, но что-то еще хуже происходит здесь, Копирование дублирования.
Правильно. и каждый раз, когда мы хотим использовать наш класс Bar, дублирование ухудшается.
Решение? Используйте Service container
Регистрация вашего регистратора в качестве сервиса означает, что весь ваш код, который нуждается в функциях ведения журнала, больше не зависит от вашего конкретного регистратора, обязанности не будут смешиваться, дублирование кода будет уменьшено, и ваш дизайн станет больше гибкий.
Отлично! Это то, что я ищу! – mustache