繁体   English   中英

使Symfony服务工厂正常失败的正确方法是什么?

[英]What is the correct way to gracefully fail Symfony service factory?

Symfony的服务工厂文档说明了如何允许服务容器使用工​​厂实例化服务,但没有解释在创建失败(即,由于某种原因服务不可用)时建议的最佳实践。

例如; 想象一下Redis内存缓存服务。 在工厂类内部,您有一个将实例化并返回Redis客户对象的方法。

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

  return $redis;
}

如果Redis服务器暂时不可用,并且我希望能够正常使用另一种解决方案来存储我们拥有的任何数据,如果工厂返回null ,抛出某种特定类型的异常,或者根本不关心可用性?

您可以使用PHP的is_object方法:

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

返回值:

如果var是一个对象 ,则返回TRUE ,否则返回FALSE。

参考: PHP is_object

如果您想使用“后备”解决方案,则最佳实践是将这些服务分组在一个通用接口下,而不是像“责任链”那样一次实例化一个服务:首先可以实例化,然后返回。 当然,在您的客户中,您将使用该界面,因此对于“客户开发人员”而言,此过程将完全简单。

达到此目的的最佳方法是使用SessionStorageFactory东西(即通用类),在其中可以“注册”所有具体工厂( RedisFactory ,..., DefaultSessionStorageFactory ),并尝试一次实例化一个。

当然,缺点是如果您需要一个“超集”属性(例如hostport等),该属性对于所有工厂都没有用,但需要参数的具体工厂却没有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM