Как правильно выйти из строя сервисной фабрики Symfony? - PullRequest
0 голосов
/ 06 июня 2018

Документация Symfony для сервисных фабрик объясняет, как разрешить контейнеру сервисов создавать экземпляры сервисов с использованием фабрик, но не объясняет, что рекомендуется делать в случае сбоя при создании, т. Е. Когда сервис недоступен для каких-либо целей.причина.

Например;представьте себе сервис кэширования памяти Redis.Внутри фабричного класса у вас есть метод, который создает экземпляр и возвращает клиентский объект Redis;

public function createRedisClient() {
  $redis = new \Redis();
  $connectionResult = $redis->connect($host, $port);

  return $redis;
}

Если сервер Redis временно недоступен, и я хотел бы иметь возможность изящно переключиться на другойрешение для хранения любых данных, которые у нас есть, должна ли фабрика возвращать null, генерировать исключение какого-то определенного вида или просто не заботиться о доступности?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы хотите использовать «резервное» решение, то лучше всего группировать такие сервисы под общим интерфейсом, а не пытаться создавать по одному за раз, как «цепочку ответственности»: первое, что может быть реализовано, возвращает.Конечно, в ваших клиентах вы будете использовать интерфейс, так что этот процесс будет совершенно простым для «разработчика клиента».

Лучший способ добиться этого - иметь что-то вроде SessionStorageFactory (так, например, общий), гдеВы можете «зарегистрировать» все конкретные фабрики (RedisFactory, ..., DefaultSessionStorageFactory) и попытаться создать их по одному.

Конечно, недостатком является то, что если вам может понадобиться «надмножество»атрибута (например, host, port и т. д.), который бесполезен для всех фабрик, кроме конкретного, для которого требуется параметр.

0 голосов
/ 06 июня 2018

Вы можете использовать PHP is_object метод:

    public function createRedisClient() {
      $redis = new \Redis();
      $connectionResult = $redis->connect($host, $port);
      if (!is_object($redis)) {
        return false;
      }
      return $redis;
}

Возвращаемое значение:

Возвращает TRUE если var объект , иначе FALSE.

Ссылка: PHP is_object

...