Open Journal Systems  3.3.0
ServiceBuilderLoader.php
1 <?php
2 
3 namespace Guzzle\Service\Builder;
4 
7 
12 {
13  protected function build($config, array $options)
14  {
15  // A service builder class can be specified in the class field
16  $class = !empty($config['class']) ? $config['class'] : __NAMESPACE__ . '\\ServiceBuilder';
17 
18  // Account for old style configs that do not have a services array
19  $services = isset($config['services']) ? $config['services'] : $config;
20 
21  // Validate the configuration and handle extensions
22  foreach ($services as $name => &$service) {
23 
24  $service['params'] = isset($service['params']) ? $service['params'] : array();
25 
26  // Check if this client builder extends another client
27  if (!empty($service['extends'])) {
28 
29  // Make sure that the service it's extending has been defined
30  if (!isset($services[$service['extends']])) {
31  throw new ServiceNotFoundException(
32  "{$name} is trying to extend a non-existent service: {$service['extends']}"
33  );
34  }
35 
36  $extended = &$services[$service['extends']];
37 
38  // Use the correct class attribute
39  if (empty($service['class'])) {
40  $service['class'] = isset($extended['class']) ? $extended['class'] : '';
41  }
42  if ($extendsParams = isset($extended['params']) ? $extended['params'] : false) {
43  $service['params'] = $service['params'] + $extendsParams;
44  }
45  }
46 
47  // Overwrite default values with global parameter values
48  if (!empty($options)) {
49  $service['params'] = $options + $service['params'];
50  }
51 
52  $service['class'] = isset($service['class']) ? $service['class'] : '';
53  }
54 
55  return new $class($services);
56  }
57 
58  protected function mergeData(array $a, array $b)
59  {
60  $result = $b + $a;
61 
62  // Merge services using a recursive union of arrays
63  if (isset($a['services']) && $b['services']) {
64 
65  // Get a union of the services of the two arrays
66  $result['services'] = $b['services'] + $a['services'];
67 
68  // Merge each service in using a union of the two arrays
69  foreach ($result['services'] as $name => &$service) {
70 
71  // By default, services completely override a previously defined service unless it extends itself
72  if (isset($a['services'][$name]['extends'])
73  && isset($b['services'][$name]['extends'])
74  && $b['services'][$name]['extends'] == $name
75  ) {
76  $service += $a['services'][$name];
77  // Use the `extends` attribute of the parent
78  $service['extends'] = $a['services'][$name]['extends'];
79  // Merge parameters using a union if both have parameters
80  if (isset($a['services'][$name]['params'])) {
81  $service['params'] += $a['services'][$name]['params'];
82  }
83  }
84  }
85  }
86 
87  return $result;
88  }
89 }
Guzzle\Service\Builder\ServiceBuilderLoader\mergeData
mergeData(array $a, array $b)
Definition: ServiceBuilderLoader.php:58
Guzzle\Service\AbstractConfigLoader
Definition: AbstractConfigLoader.php:11
Guzzle\Service\Builder\ServiceBuilderLoader
Definition: ServiceBuilderLoader.php:11
Guzzle\Service\Exception\ServiceNotFoundException
Definition: ServiceNotFoundException.php:5
Guzzle\Service\Builder\ServiceBuilderLoader\build
build($config, array $options)
Definition: ServiceBuilderLoader.php:13
Guzzle\Service\Builder
Definition: ServiceBuilder.php:3