Open Journal Systems  3.3.0
ClassDiscovery.php
1 <?php
2 
3 namespace Http\Discovery;
4 
9 
17 abstract class ClassDiscovery
18 {
24  private static $strategies = [
25  Strategy\PuliBetaStrategy::class,
26  Strategy\CommonClassesStrategy::class,
27  Strategy\CommonPsr17ClassesStrategy::class,
28  ];
29 
35  private static $cache = [];
36 
46  protected static function findOneByType($type)
47  {
48  // Look in the cache
49  if (null !== ($class = self::getFromCache($type))) {
50  return $class;
51  }
52 
53  $exceptions = [];
54  foreach (self::$strategies as $strategy) {
55  try {
56  $candidates = call_user_func($strategy.'::getCandidates', $type);
57  } catch (StrategyUnavailableException $e) {
58  $exceptions[] = $e;
59 
60  continue;
61  }
62 
63  foreach ($candidates as $candidate) {
64  if (isset($candidate['condition'])) {
65  if (!self::evaluateCondition($candidate['condition'])) {
66  continue;
67  }
68  }
69 
70  // save the result for later use
71  self::storeInCache($type, $candidate);
72 
73  return $candidate['class'];
74  }
75 
76  $exceptions[] = new NoCandidateFoundException($strategy, $candidates);
77  }
78 
79  throw DiscoveryFailedException::create($exceptions);
80  }
81 
89  private static function getFromCache($type)
90  {
91  if (!isset(self::$cache[$type])) {
92  return;
93  }
94 
95  $candidate = self::$cache[$type];
96  if (isset($candidate['condition'])) {
97  if (!self::evaluateCondition($candidate['condition'])) {
98  return;
99  }
100  }
101 
102  return $candidate['class'];
103  }
104 
111  private static function storeInCache($type, $class)
112  {
113  self::$cache[$type] = $class;
114  }
115 
121  public static function setStrategies(array $strategies)
122  {
123  self::$strategies = $strategies;
125  }
126 
132  public static function appendStrategy($strategy)
133  {
134  self::$strategies[] = $strategy;
136  }
137 
143  public static function prependStrategy($strategy)
144  {
145  array_unshift(self::$strategies, $strategy);
147  }
148 
152  public static function clearCache()
153  {
154  self::$cache = [];
155  }
156 
164  protected static function evaluateCondition($condition)
165  {
166  if (is_string($condition)) {
167  // Should be extended for functions, extensions???
168  return self::safeClassExists($condition);
169  }
170  if (is_callable($condition)) {
171  return (bool) $condition();
172  }
173  if (is_bool($condition)) {
174  return $condition;
175  }
176  if (is_array($condition)) {
177  foreach ($condition as $c) {
178  if (false === static::evaluateCondition($c)) {
179  // Immediately stop execution if the condition is false
180  return false;
181  }
182  }
183 
184  return true;
185  }
186 
187  return false;
188  }
189 
199  protected static function instantiateClass($class)
200  {
201  try {
202  if (is_string($class)) {
203  return new $class();
204  }
205 
206  if (is_callable($class)) {
207  return $class();
208  }
209  } catch (\Exception $e) {
210  throw new ClassInstantiationFailedException('Unexpected exception when instantiating class.', 0, $e);
211  }
212 
213  throw new ClassInstantiationFailedException('Could not instantiate class because parameter is neither a callable nor a string');
214  }
215 
228  public static function safeClassExists($class)
229  {
230  try {
231  return class_exists($class) || interface_exists($class);
232  } catch (\Exception $e) {
233  return false;
234  }
235  }
236 }
Http\Discovery
Definition: ClassDiscovery.php:3
Http\Discovery\Exception
Definition: paymethod/paypal/vendor/php-http/discovery/src/Exception.php:10
Http\Discovery\ClassDiscovery
Definition: ClassDiscovery.php:17
Http\Discovery\Exception\ClassInstantiationFailedException
Definition: ClassInstantiationFailedException.php:12
Http\Discovery\ClassDiscovery\setStrategies
static setStrategies(array $strategies)
Definition: ClassDiscovery.php:121
Http\Discovery\ClassDiscovery\evaluateCondition
static evaluateCondition($condition)
Definition: ClassDiscovery.php:164
Http\Discovery\Exception\DiscoveryFailedException
Definition: DiscoveryFailedException.php:12
Http\Discovery\ClassDiscovery\findOneByType
static findOneByType($type)
Definition: ClassDiscovery.php:46
Http\Discovery\ClassDiscovery\clearCache
static clearCache()
Definition: ClassDiscovery.php:152
Http\Discovery\ClassDiscovery\instantiateClass
static instantiateClass($class)
Definition: ClassDiscovery.php:199
Http\Discovery\Exception\StrategyUnavailableException
Definition: StrategyUnavailableException.php:13
Http\Discovery\ClassDiscovery\safeClassExists
static safeClassExists($class)
Definition: ClassDiscovery.php:228
Http\Discovery\Exception\DiscoveryFailedException\create
static create($exceptions)
Definition: DiscoveryFailedException.php:36
Http\Discovery\Exception\NoCandidateFoundException
Definition: NoCandidateFoundException.php:12
Http\Discovery\ClassDiscovery\prependStrategy
static prependStrategy($strategy)
Definition: ClassDiscovery.php:143
Http\Discovery\ClassDiscovery\appendStrategy
static appendStrategy($strategy)
Definition: ClassDiscovery.php:132