Это хорошее использование реестра? - PullRequest
1 голос
/ 04 февраля 2011

Основная цель - сделать основные классы (созданные с помощью params) доступными из любого места приложения - в контроллерах, преобразователях, моделях, помощниках и т. Д.

Например, у нас есть преобразователь, который зависит от объекта базы данных:

class Foo_Mapper
{
    private $database;

    public function __construct(Database $database)
    {
        $this->database = $database;
    }

    public function getFoo(array $criteria)
    {
        // ...
    }
}

Вариант 1: Внедрение базовой зависимости.Проблема в том, что каждый раз, когда мне нужно создать mapper, мне также нужно создавать экземпляр объекта базы данных (с параметрами).

$database = new Database($params);

$foo_mapper = new Foo_Mapper($database);

Вариант 2: Реестр.Основные объекты создаются и помещаются в реестр, чтобы любой другой объект мог легко получить к ним доступ.

// Somewhere in bootstrap...
$registry = Registry::getInstance();
$registry->database = new Database($params));

// Usage
$registry = Registry::getInstance();

$foo_mapper = new Foo_Mapper($registry->database);

Есть ли лучший способ сделать то, что я хочу?Есть ли недостатки?

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Вариант 1: Внедрение базовой зависимости.Проблема в том, что каждый раз, когда мне нужно создать mapper, мне также нужно создавать экземпляр объекта базы данных (с параметрами).

или передавать его вместе.Если вы используете контейнер внедрения зависимостей, вам даже придется делать это вручную: вы просто добавляете, что вам нужно для извлечения базы данных, и база данных будет создана (или повторно использована) для вас.Попросите Контейнер создать контроллер и убедитесь, что вы перечислили свои зависимости в конструкторе.Существует несколько достойных контейнеров внедрения зависимостей для PHP:

Для полного раскрытия: я написал последний.

Вариант 2: Реестр.Базовые объекты создаются и помещаются в реестр, чтобы любой другой объект мог легко получить к ним доступ.

Вы можете сделать реестр нестатичным, но если вы собираетесь полагаться на объект Registry в своем приложенииВы могли бы также оставить это статичным.Это вполне жизнеспособное решение с одним очевидным недостатком: вы не знаете, какие объекты используются какими объектами, глядя на API.Вам придется копаться в коде.

0 голосов
/ 04 февраля 2011

Вы можете сделать это синглтоном. Как это:

class Database
{
  private static $instance = null;
  public static getInstance()
  {
    if (self::$instance == null) self::$instance = new Database();
    return self::$instance;
  }
   // ... METHODS ... //
   // ... METHODS ... //
   //      .....      //
}

Тогда вы можете использовать новый Foo_Mapper (Database :: getInstance ()); Похоже, вы сделали это со своим реестром. Тогда вам больше не нужен ваш реестр. Хотя, если ваши классы написаны кем-то другим, вам все равно придется использовать что-то вроде реестра или создать вспомогательный класс / функцию для каждого из тех классов, которые не используют шаблон синглтона.

Думаю, то, как ты это проиллюстрировал, мне кажется нормальным. Было бы плохо, если бы вы вызывали свой реестр из Foo_Mapper, потому что этот класс, вероятно, не должен знать о существовании реестра, но этот способ выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...