@@ -15,59 +15,59 @@ |
||
15 | 15 | class CoffeeMill |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * @var CoffeeShop $coffee_shop |
|
20 | - */ |
|
21 | - private static $coffee_shop; |
|
18 | + /** |
|
19 | + * @var CoffeeShop $coffee_shop |
|
20 | + */ |
|
21 | + private static $coffee_shop; |
|
22 | 22 | |
23 | 23 | |
24 | - /** |
|
25 | - * @return mixed |
|
26 | - */ |
|
27 | - public static function getCoffeeShop() |
|
28 | - { |
|
29 | - return self::$coffee_shop; |
|
30 | - } |
|
24 | + /** |
|
25 | + * @return mixed |
|
26 | + */ |
|
27 | + public static function getCoffeeShop() |
|
28 | + { |
|
29 | + return self::$coffee_shop; |
|
30 | + } |
|
31 | 31 | |
32 | 32 | |
33 | - /** |
|
34 | - * @param CoffeeShop $coffee_shop |
|
35 | - */ |
|
36 | - public static function setCoffeeShop(CoffeeShop $coffee_shop) |
|
37 | - { |
|
38 | - self::$coffee_shop = $coffee_shop; |
|
39 | - } |
|
33 | + /** |
|
34 | + * @param CoffeeShop $coffee_shop |
|
35 | + */ |
|
36 | + public static function setCoffeeShop(CoffeeShop $coffee_shop) |
|
37 | + { |
|
38 | + self::$coffee_shop = $coffee_shop; |
|
39 | + } |
|
40 | 40 | |
41 | 41 | |
42 | - /** |
|
43 | - * @param string $identifier |
|
44 | - * @param array $arguments |
|
45 | - * @param string $type |
|
46 | - * @return mixed |
|
47 | - * @throws ServiceNotFoundException |
|
48 | - */ |
|
49 | - public static function createNew($identifier, $arguments = array(), $type = CoffeeMaker::BREW_NEW) |
|
50 | - { |
|
51 | - return self::$coffee_shop->brew($identifier, $arguments, $type); |
|
52 | - } |
|
42 | + /** |
|
43 | + * @param string $identifier |
|
44 | + * @param array $arguments |
|
45 | + * @param string $type |
|
46 | + * @return mixed |
|
47 | + * @throws ServiceNotFoundException |
|
48 | + */ |
|
49 | + public static function createNew($identifier, $arguments = array(), $type = CoffeeMaker::BREW_NEW) |
|
50 | + { |
|
51 | + return self::$coffee_shop->brew($identifier, $arguments, $type); |
|
52 | + } |
|
53 | 53 | |
54 | 54 | |
55 | - /** |
|
56 | - * IMPORTANT!!! |
|
57 | - * Usage of this method is discouraged as it promotes service location. |
|
58 | - * It's current use is only as a stop gap measure until the CoffeeShop |
|
59 | - * Dependency Injection Container can be implemented properly for all classes. |
|
60 | - * If it is at all possible, inject your dependencies via your class constructor. |
|
61 | - * This method WILL BE DEPRECATED at some point in the near future. |
|
62 | - * |
|
63 | - * @param string $identifier |
|
64 | - * @param array $arguments |
|
65 | - * @param string $type |
|
66 | - * @return mixed |
|
67 | - * @throws ServiceNotFoundException |
|
68 | - */ |
|
69 | - public static function getService($identifier, $arguments = array(), $type = CoffeeMaker::BREW_SHARED) |
|
70 | - { |
|
71 | - return self::$coffee_shop->brew($identifier, $arguments, $type); |
|
72 | - } |
|
55 | + /** |
|
56 | + * IMPORTANT!!! |
|
57 | + * Usage of this method is discouraged as it promotes service location. |
|
58 | + * It's current use is only as a stop gap measure until the CoffeeShop |
|
59 | + * Dependency Injection Container can be implemented properly for all classes. |
|
60 | + * If it is at all possible, inject your dependencies via your class constructor. |
|
61 | + * This method WILL BE DEPRECATED at some point in the near future. |
|
62 | + * |
|
63 | + * @param string $identifier |
|
64 | + * @param array $arguments |
|
65 | + * @param string $type |
|
66 | + * @return mixed |
|
67 | + * @throws ServiceNotFoundException |
|
68 | + */ |
|
69 | + public static function getService($identifier, $arguments = array(), $type = CoffeeMaker::BREW_SHARED) |
|
70 | + { |
|
71 | + return self::$coffee_shop->brew($identifier, $arguments, $type); |
|
72 | + } |
|
73 | 73 | } |
@@ -15,25 +15,25 @@ |
||
15 | 15 | class InstantiationException extends BadMethodCallException |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * InstantiationException constructor. |
|
20 | - * |
|
21 | - * @param string $identifier the name of the requested entity or service |
|
22 | - * @param string $message |
|
23 | - * @param int $code |
|
24 | - * @param \Exception $previous |
|
25 | - */ |
|
26 | - public function __construct($identifier, $message = '', $code = 0, \Exception $previous = null) |
|
27 | - { |
|
28 | - if (empty($message)) { |
|
29 | - $message = sprintf( |
|
30 | - __( |
|
31 | - 'The "%1$s" class could not be constructed.', |
|
32 | - 'event_espresso' |
|
33 | - ), |
|
34 | - $identifier |
|
35 | - ); |
|
36 | - } |
|
37 | - parent::__construct($message, $code, $previous); |
|
38 | - } |
|
18 | + /** |
|
19 | + * InstantiationException constructor. |
|
20 | + * |
|
21 | + * @param string $identifier the name of the requested entity or service |
|
22 | + * @param string $message |
|
23 | + * @param int $code |
|
24 | + * @param \Exception $previous |
|
25 | + */ |
|
26 | + public function __construct($identifier, $message = '', $code = 0, \Exception $previous = null) |
|
27 | + { |
|
28 | + if (empty($message)) { |
|
29 | + $message = sprintf( |
|
30 | + __( |
|
31 | + 'The "%1$s" class could not be constructed.', |
|
32 | + 'event_espresso' |
|
33 | + ), |
|
34 | + $identifier |
|
35 | + ); |
|
36 | + } |
|
37 | + parent::__construct($message, $code, $previous); |
|
38 | + } |
|
39 | 39 | } |
@@ -14,26 +14,26 @@ |
||
14 | 14 | { |
15 | 15 | |
16 | 16 | |
17 | - /** |
|
18 | - * ServiceExistsException constructor |
|
19 | - * |
|
20 | - * @param string $service_name the name of the requested service |
|
21 | - * @param string $message |
|
22 | - * @param int $code |
|
23 | - * @param \Exception $previous |
|
24 | - */ |
|
25 | - public function __construct( |
|
26 | - $service_name, |
|
27 | - $message = '', |
|
28 | - $code = 0, |
|
29 | - \Exception $previous = null |
|
30 | - ) { |
|
31 | - if (empty($message)) { |
|
32 | - $message = sprintf( |
|
33 | - __('The "%1$s" service already exists in the CoffeeShop and can not be added again.', 'event_espresso'), |
|
34 | - $service_name |
|
35 | - ); |
|
36 | - } |
|
37 | - parent::__construct($message, $code, $previous); |
|
38 | - } |
|
17 | + /** |
|
18 | + * ServiceExistsException constructor |
|
19 | + * |
|
20 | + * @param string $service_name the name of the requested service |
|
21 | + * @param string $message |
|
22 | + * @param int $code |
|
23 | + * @param \Exception $previous |
|
24 | + */ |
|
25 | + public function __construct( |
|
26 | + $service_name, |
|
27 | + $message = '', |
|
28 | + $code = 0, |
|
29 | + \Exception $previous = null |
|
30 | + ) { |
|
31 | + if (empty($message)) { |
|
32 | + $message = sprintf( |
|
33 | + __('The "%1$s" service already exists in the CoffeeShop and can not be added again.', 'event_espresso'), |
|
34 | + $service_name |
|
35 | + ); |
|
36 | + } |
|
37 | + parent::__construct($message, $code, $previous); |
|
38 | + } |
|
39 | 39 | } |
@@ -12,26 +12,26 @@ |
||
12 | 12 | class ServiceNotFoundException extends \RuntimeException |
13 | 13 | { |
14 | 14 | |
15 | - /** |
|
16 | - * ServiceNotFoundException constructor |
|
17 | - * |
|
18 | - * @param string $service_name the name of the requested service |
|
19 | - * @param string $message |
|
20 | - * @param int $code |
|
21 | - * @param \Exception $previous |
|
22 | - */ |
|
23 | - public function __construct( |
|
24 | - $service_name, |
|
25 | - $message = '', |
|
26 | - $code = 0, |
|
27 | - \Exception $previous = null |
|
28 | - ) { |
|
29 | - if (empty($message)) { |
|
30 | - $message = sprintf( |
|
31 | - __('The requested service "%1$s" could not found be found in the CoffeeShop.', 'event_espresso'), |
|
32 | - $service_name |
|
33 | - ); |
|
34 | - } |
|
35 | - parent::__construct($message, $code, $previous); |
|
36 | - } |
|
15 | + /** |
|
16 | + * ServiceNotFoundException constructor |
|
17 | + * |
|
18 | + * @param string $service_name the name of the requested service |
|
19 | + * @param string $message |
|
20 | + * @param int $code |
|
21 | + * @param \Exception $previous |
|
22 | + */ |
|
23 | + public function __construct( |
|
24 | + $service_name, |
|
25 | + $message = '', |
|
26 | + $code = 0, |
|
27 | + \Exception $previous = null |
|
28 | + ) { |
|
29 | + if (empty($message)) { |
|
30 | + $message = sprintf( |
|
31 | + __('The requested service "%1$s" could not found be found in the CoffeeShop.', 'event_espresso'), |
|
32 | + $service_name |
|
33 | + ); |
|
34 | + } |
|
35 | + parent::__construct($message, $code, $previous); |
|
36 | + } |
|
37 | 37 | } |
@@ -13,27 +13,27 @@ |
||
13 | 13 | class InvalidServiceException extends \UnexpectedValueException |
14 | 14 | { |
15 | 15 | |
16 | - /** |
|
17 | - * InvalidServiceException constructor. |
|
18 | - * |
|
19 | - * @param string $service_name the name of the requested service |
|
20 | - * @param string $actual classname of what we got |
|
21 | - * @param string $message |
|
22 | - * @param int $code |
|
23 | - * @param \Exception $previous |
|
24 | - */ |
|
25 | - public function __construct($service_name, $actual, $message = '', $code = 0, \Exception $previous = null) |
|
26 | - { |
|
27 | - if (empty($message)) { |
|
28 | - $message = sprintf( |
|
29 | - __( |
|
30 | - 'The "%1$s" service could not be retrieved from the CoffeeShop, but "%2$s" was received.', |
|
31 | - 'event_espresso' |
|
32 | - ), |
|
33 | - $service_name, |
|
34 | - print_r($actual, true) |
|
35 | - ); |
|
36 | - } |
|
37 | - parent::__construct($message, $code, $previous); |
|
38 | - } |
|
16 | + /** |
|
17 | + * InvalidServiceException constructor. |
|
18 | + * |
|
19 | + * @param string $service_name the name of the requested service |
|
20 | + * @param string $actual classname of what we got |
|
21 | + * @param string $message |
|
22 | + * @param int $code |
|
23 | + * @param \Exception $previous |
|
24 | + */ |
|
25 | + public function __construct($service_name, $actual, $message = '', $code = 0, \Exception $previous = null) |
|
26 | + { |
|
27 | + if (empty($message)) { |
|
28 | + $message = sprintf( |
|
29 | + __( |
|
30 | + 'The "%1$s" service could not be retrieved from the CoffeeShop, but "%2$s" was received.', |
|
31 | + 'event_espresso' |
|
32 | + ), |
|
33 | + $service_name, |
|
34 | + print_r($actual, true) |
|
35 | + ); |
|
36 | + } |
|
37 | + parent::__construct($message, $code, $previous); |
|
38 | + } |
|
39 | 39 | } |
@@ -20,51 +20,51 @@ |
||
20 | 20 | { |
21 | 21 | |
22 | 22 | |
23 | - /** |
|
24 | - * @return string |
|
25 | - */ |
|
26 | - public function type() |
|
27 | - { |
|
28 | - return CoffeeMaker::BREW_NEW; |
|
29 | - } |
|
23 | + /** |
|
24 | + * @return string |
|
25 | + */ |
|
26 | + public function type() |
|
27 | + { |
|
28 | + return CoffeeMaker::BREW_NEW; |
|
29 | + } |
|
30 | 30 | |
31 | 31 | |
32 | - /** |
|
33 | - * @param RecipeInterface $recipe |
|
34 | - * @param array $arguments |
|
35 | - * @return mixed |
|
36 | - */ |
|
37 | - public function brew(RecipeInterface $recipe, $arguments = array()) |
|
38 | - { |
|
39 | - $this->resolveClassAndFilepath($recipe); |
|
40 | - $reflector = $this->injector()->getReflectionClass($recipe->fqcn()); |
|
41 | - $method = $this->resolveInstantiationMethod($reflector); |
|
42 | - switch ($method) { |
|
43 | - case 'instance': |
|
44 | - case 'new_instance': |
|
45 | - case 'new_instance_from_db': |
|
46 | - $injector = $this->injector(); |
|
47 | - $closure = function ($arguments) use ($recipe, $reflector, $method, $injector) { |
|
48 | - return call_user_func_array( |
|
49 | - array($reflector->getName(), $method), |
|
50 | - $injector->resolveDependencies($recipe, $reflector, $arguments) |
|
51 | - ); |
|
52 | - }; |
|
53 | - break; |
|
54 | - case 'newInstance': |
|
55 | - $closure = function () use ($reflector) { |
|
56 | - return $reflector->newInstance(); |
|
57 | - }; |
|
58 | - break; |
|
59 | - case 'newInstanceArgs': |
|
60 | - default: |
|
61 | - $injector = $this->injector(); |
|
62 | - $closure = function ($arguments) use ($recipe, $reflector, $injector) { |
|
63 | - return $reflector->newInstanceArgs( |
|
64 | - $injector->resolveDependencies($recipe, $reflector, $arguments) |
|
65 | - ); |
|
66 | - }; |
|
67 | - } |
|
68 | - return $this->coffeePot()->addClosure($recipe->identifier(), $closure); |
|
69 | - } |
|
32 | + /** |
|
33 | + * @param RecipeInterface $recipe |
|
34 | + * @param array $arguments |
|
35 | + * @return mixed |
|
36 | + */ |
|
37 | + public function brew(RecipeInterface $recipe, $arguments = array()) |
|
38 | + { |
|
39 | + $this->resolveClassAndFilepath($recipe); |
|
40 | + $reflector = $this->injector()->getReflectionClass($recipe->fqcn()); |
|
41 | + $method = $this->resolveInstantiationMethod($reflector); |
|
42 | + switch ($method) { |
|
43 | + case 'instance': |
|
44 | + case 'new_instance': |
|
45 | + case 'new_instance_from_db': |
|
46 | + $injector = $this->injector(); |
|
47 | + $closure = function ($arguments) use ($recipe, $reflector, $method, $injector) { |
|
48 | + return call_user_func_array( |
|
49 | + array($reflector->getName(), $method), |
|
50 | + $injector->resolveDependencies($recipe, $reflector, $arguments) |
|
51 | + ); |
|
52 | + }; |
|
53 | + break; |
|
54 | + case 'newInstance': |
|
55 | + $closure = function () use ($reflector) { |
|
56 | + return $reflector->newInstance(); |
|
57 | + }; |
|
58 | + break; |
|
59 | + case 'newInstanceArgs': |
|
60 | + default: |
|
61 | + $injector = $this->injector(); |
|
62 | + $closure = function ($arguments) use ($recipe, $reflector, $injector) { |
|
63 | + return $reflector->newInstanceArgs( |
|
64 | + $injector->resolveDependencies($recipe, $reflector, $arguments) |
|
65 | + ); |
|
66 | + }; |
|
67 | + } |
|
68 | + return $this->coffeePot()->addClosure($recipe->identifier(), $closure); |
|
69 | + } |
|
70 | 70 | } |
@@ -44,7 +44,7 @@ discard block |
||
44 | 44 | case 'new_instance': |
45 | 45 | case 'new_instance_from_db': |
46 | 46 | $injector = $this->injector(); |
47 | - $closure = function ($arguments) use ($recipe, $reflector, $method, $injector) { |
|
47 | + $closure = function($arguments) use ($recipe, $reflector, $method, $injector) { |
|
48 | 48 | return call_user_func_array( |
49 | 49 | array($reflector->getName(), $method), |
50 | 50 | $injector->resolveDependencies($recipe, $reflector, $arguments) |
@@ -52,14 +52,14 @@ discard block |
||
52 | 52 | }; |
53 | 53 | break; |
54 | 54 | case 'newInstance': |
55 | - $closure = function () use ($reflector) { |
|
55 | + $closure = function() use ($reflector) { |
|
56 | 56 | return $reflector->newInstance(); |
57 | 57 | }; |
58 | 58 | break; |
59 | 59 | case 'newInstanceArgs': |
60 | 60 | default: |
61 | 61 | $injector = $this->injector(); |
62 | - $closure = function ($arguments) use ($recipe, $reflector, $injector) { |
|
62 | + $closure = function($arguments) use ($recipe, $reflector, $injector) { |
|
63 | 63 | return $reflector->newInstanceArgs( |
64 | 64 | $injector->resolveDependencies($recipe, $reflector, $arguments) |
65 | 65 | ); |
@@ -17,130 +17,130 @@ |
||
17 | 17 | class RegistryContainer implements ArrayAccess, CountableTraversableAggregate |
18 | 18 | { |
19 | 19 | |
20 | - /** |
|
21 | - * @var array $container |
|
22 | - */ |
|
23 | - private $container; |
|
24 | - |
|
25 | - /** |
|
26 | - * RegistryContainer constructor. |
|
27 | - * Container data can be seeded by passing parameters to constructor. |
|
28 | - * Each parameter will become its own element in the container |
|
29 | - */ |
|
30 | - public function __construct() |
|
31 | - { |
|
32 | - $this->container = func_get_args(); |
|
33 | - if (func_num_args() === 0) { |
|
34 | - $this->container = array(); |
|
35 | - } |
|
36 | - } |
|
37 | - |
|
38 | - |
|
39 | - /** |
|
40 | - * @param mixed $offset |
|
41 | - * @param mixed $value |
|
42 | - */ |
|
43 | - public function offsetSet($offset, $value) |
|
44 | - { |
|
45 | - $this->container[$offset] = $value; |
|
46 | - } |
|
47 | - |
|
48 | - |
|
49 | - /** |
|
50 | - * @param mixed $offset |
|
51 | - * @return bool |
|
52 | - */ |
|
53 | - public function offsetExists($offset) |
|
54 | - { |
|
55 | - return isset($this->container[$offset]); |
|
56 | - } |
|
57 | - |
|
58 | - |
|
59 | - /** |
|
60 | - * @param mixed $offset |
|
61 | - */ |
|
62 | - public function offsetUnset($offset) |
|
63 | - { |
|
64 | - unset($this->container[$offset]); |
|
65 | - } |
|
66 | - |
|
67 | - |
|
68 | - /** |
|
69 | - * @param mixed $offset |
|
70 | - * @return mixed|null |
|
71 | - */ |
|
72 | - public function offsetGet($offset) |
|
73 | - { |
|
74 | - return isset($this->container[$offset]) ? $this->container[$offset] : null; |
|
75 | - } |
|
76 | - |
|
77 | - |
|
78 | - /** |
|
79 | - * @return int |
|
80 | - */ |
|
81 | - public function count() |
|
82 | - { |
|
83 | - return count($this->container); |
|
84 | - } |
|
85 | - |
|
86 | - |
|
87 | - /** |
|
88 | - * @return ArrayIterator |
|
89 | - */ |
|
90 | - public function getIterator() |
|
91 | - { |
|
92 | - return new ArrayIterator($this->container); |
|
93 | - } |
|
94 | - |
|
95 | - |
|
96 | - /** |
|
97 | - * @param $offset |
|
98 | - * @param $value |
|
99 | - */ |
|
100 | - public function __set($offset, $value) |
|
101 | - { |
|
102 | - $this->container[$offset] = $value; |
|
103 | - } |
|
104 | - |
|
105 | - |
|
106 | - /** |
|
107 | - * @param $offset |
|
108 | - * @return mixed |
|
109 | - * @throws OutOfBoundsException |
|
110 | - */ |
|
111 | - public function __get($offset) |
|
112 | - { |
|
113 | - if (array_key_exists($offset, $this->container)) { |
|
114 | - return $this->container[$offset]; |
|
115 | - } |
|
116 | - $trace = debug_backtrace(); |
|
117 | - throw new OutOfBoundsException( |
|
118 | - sprintf( |
|
119 | - esc_html__('Invalid offset: %1$s %2$sCalled from %3$s on line %4$d', 'event_espresso'), |
|
120 | - $offset, |
|
121 | - '<br />', |
|
122 | - $trace[0]['file'], |
|
123 | - $trace[0]['line'] |
|
124 | - ) |
|
125 | - ); |
|
126 | - } |
|
127 | - |
|
128 | - |
|
129 | - /** |
|
130 | - * @param $offset |
|
131 | - * @return bool |
|
132 | - */ |
|
133 | - public function __isset($offset) |
|
134 | - { |
|
135 | - return isset($this->container[$offset]); |
|
136 | - } |
|
137 | - |
|
138 | - |
|
139 | - /** |
|
140 | - * @param $offset |
|
141 | - */ |
|
142 | - public function __unset($offset) |
|
143 | - { |
|
144 | - unset($this->container[$offset]); |
|
145 | - } |
|
20 | + /** |
|
21 | + * @var array $container |
|
22 | + */ |
|
23 | + private $container; |
|
24 | + |
|
25 | + /** |
|
26 | + * RegistryContainer constructor. |
|
27 | + * Container data can be seeded by passing parameters to constructor. |
|
28 | + * Each parameter will become its own element in the container |
|
29 | + */ |
|
30 | + public function __construct() |
|
31 | + { |
|
32 | + $this->container = func_get_args(); |
|
33 | + if (func_num_args() === 0) { |
|
34 | + $this->container = array(); |
|
35 | + } |
|
36 | + } |
|
37 | + |
|
38 | + |
|
39 | + /** |
|
40 | + * @param mixed $offset |
|
41 | + * @param mixed $value |
|
42 | + */ |
|
43 | + public function offsetSet($offset, $value) |
|
44 | + { |
|
45 | + $this->container[$offset] = $value; |
|
46 | + } |
|
47 | + |
|
48 | + |
|
49 | + /** |
|
50 | + * @param mixed $offset |
|
51 | + * @return bool |
|
52 | + */ |
|
53 | + public function offsetExists($offset) |
|
54 | + { |
|
55 | + return isset($this->container[$offset]); |
|
56 | + } |
|
57 | + |
|
58 | + |
|
59 | + /** |
|
60 | + * @param mixed $offset |
|
61 | + */ |
|
62 | + public function offsetUnset($offset) |
|
63 | + { |
|
64 | + unset($this->container[$offset]); |
|
65 | + } |
|
66 | + |
|
67 | + |
|
68 | + /** |
|
69 | + * @param mixed $offset |
|
70 | + * @return mixed|null |
|
71 | + */ |
|
72 | + public function offsetGet($offset) |
|
73 | + { |
|
74 | + return isset($this->container[$offset]) ? $this->container[$offset] : null; |
|
75 | + } |
|
76 | + |
|
77 | + |
|
78 | + /** |
|
79 | + * @return int |
|
80 | + */ |
|
81 | + public function count() |
|
82 | + { |
|
83 | + return count($this->container); |
|
84 | + } |
|
85 | + |
|
86 | + |
|
87 | + /** |
|
88 | + * @return ArrayIterator |
|
89 | + */ |
|
90 | + public function getIterator() |
|
91 | + { |
|
92 | + return new ArrayIterator($this->container); |
|
93 | + } |
|
94 | + |
|
95 | + |
|
96 | + /** |
|
97 | + * @param $offset |
|
98 | + * @param $value |
|
99 | + */ |
|
100 | + public function __set($offset, $value) |
|
101 | + { |
|
102 | + $this->container[$offset] = $value; |
|
103 | + } |
|
104 | + |
|
105 | + |
|
106 | + /** |
|
107 | + * @param $offset |
|
108 | + * @return mixed |
|
109 | + * @throws OutOfBoundsException |
|
110 | + */ |
|
111 | + public function __get($offset) |
|
112 | + { |
|
113 | + if (array_key_exists($offset, $this->container)) { |
|
114 | + return $this->container[$offset]; |
|
115 | + } |
|
116 | + $trace = debug_backtrace(); |
|
117 | + throw new OutOfBoundsException( |
|
118 | + sprintf( |
|
119 | + esc_html__('Invalid offset: %1$s %2$sCalled from %3$s on line %4$d', 'event_espresso'), |
|
120 | + $offset, |
|
121 | + '<br />', |
|
122 | + $trace[0]['file'], |
|
123 | + $trace[0]['line'] |
|
124 | + ) |
|
125 | + ); |
|
126 | + } |
|
127 | + |
|
128 | + |
|
129 | + /** |
|
130 | + * @param $offset |
|
131 | + * @return bool |
|
132 | + */ |
|
133 | + public function __isset($offset) |
|
134 | + { |
|
135 | + return isset($this->container[$offset]); |
|
136 | + } |
|
137 | + |
|
138 | + |
|
139 | + /** |
|
140 | + * @param $offset |
|
141 | + */ |
|
142 | + public function __unset($offset) |
|
143 | + { |
|
144 | + unset($this->container[$offset]); |
|
145 | + } |
|
146 | 146 | } |
@@ -19,310 +19,310 @@ |
||
19 | 19 | class Recipe implements RecipeInterface |
20 | 20 | { |
21 | 21 | |
22 | - /** |
|
23 | - * A default Recipe to use if none is specified for a class |
|
24 | - */ |
|
25 | - const DEFAULT_ID = '*'; |
|
26 | - |
|
27 | - /** |
|
28 | - * Identifier for the entity class to be constructed. |
|
29 | - * Typically a Fully Qualified Class Name |
|
30 | - * |
|
31 | - * @var string $identifier |
|
32 | - */ |
|
33 | - private $identifier; |
|
34 | - |
|
35 | - /** |
|
36 | - * Fully Qualified Class Name |
|
37 | - * |
|
38 | - * @var string $fqcn |
|
39 | - */ |
|
40 | - private $fqcn; |
|
41 | - |
|
42 | - /** |
|
43 | - * a dependency class map array |
|
44 | - * If a Recipe is for a single class (or group of classes that shares the EXACT SAME constructor arguments), |
|
45 | - * and that class type hints for an interface, then this property allows you to configure what dependencies |
|
46 | - * get used when instantiating the class. |
|
47 | - * For example: |
|
48 | - * There's a class called Coffee, and one of its constructor arguments is BeanInterface |
|
49 | - * There are two implementations of BeanInterface: HonduranBean, and KenyanBean |
|
50 | - * We want one Coffee object to use HonduranBean for its BeanInterface, |
|
51 | - * and the 2nd Coffee object to use KenyanBean for its BeanInterface. |
|
52 | - * To do this, we need to create two Recipes: |
|
53 | - * one with an identifier of 'HonduranCoffee' using the following ingredients : |
|
54 | - * array('BeanInterface' => 'HonduranBean') |
|
55 | - * and the other with an identifier of 'KenyanCoffee' using the following ingredients : |
|
56 | - * array('BeanInterface' => 'KenyanBean') |
|
57 | - * Then, whenever the CoffeeShop brews an instance of HonduranCoffee, |
|
58 | - * an instance of HonduranBean will get injected for the BeanInterface dependency, |
|
59 | - * and whenever the CoffeeShop brews an instance of KenyanCoffee, |
|
60 | - * an instance of KenyanBean will get injected for the BeanInterface dependency |
|
61 | - * |
|
62 | - * @var array $ingredients |
|
63 | - */ |
|
64 | - private $ingredients = array(); |
|
65 | - |
|
66 | - /** |
|
67 | - * one of the class constants from CoffeeShop: |
|
68 | - * CoffeeMaker::BREW_NEW - creates a new instance |
|
69 | - * CoffeeMaker::BREW_SHARED - creates a shared instance |
|
70 | - * CoffeeMaker::BREW_LOAD_ONLY - loads but does not instantiate |
|
71 | - * |
|
72 | - * @var string $type |
|
73 | - */ |
|
74 | - private $type; |
|
75 | - |
|
76 | - /** |
|
77 | - * class name aliases - typically a Fully Qualified Interface that the class implements |
|
78 | - * identifiers passed to the CoffeeShop will be run through the filters to find the correct class name |
|
79 | - * |
|
80 | - * @var array $filters |
|
81 | - */ |
|
82 | - private $filters = array(); |
|
83 | - |
|
84 | - /** |
|
85 | - * array of full server filepaths to files that may contain the class |
|
86 | - * |
|
87 | - * @var array $paths |
|
88 | - */ |
|
89 | - private $paths = array(); |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * Recipe constructor. |
|
94 | - * |
|
95 | - * @param string $identifier class identifier, can be an alias, or FQCN, or whatever |
|
96 | - * @param string $fqcn \Fully\Qualified\ClassName, optional if $identifier is FQCN |
|
97 | - * @param array $ingredients array of dependencies that can not be resolved automatically, |
|
98 | - * used for resolving concrete classes for type hinted interfaces |
|
99 | - * for the dependencies of THIS class |
|
100 | - * @param string $type recipe type: one of the class constants on |
|
101 | - * \EventEspresso\core\services\container\CoffeeMaker |
|
102 | - * @param array $filters array of class aliases, or class interfaces |
|
103 | - * this works somewhat opposite to the $ingredients array above, |
|
104 | - * in that this array specifies interfaces or aliases |
|
105 | - * that this Recipe can be used for when resolving OTHER class's dependencies |
|
106 | - * @param array $paths if class can not be loaded via PSR-4 autoloading, |
|
107 | - * then supply a filepath, or array of filepaths, so that it can be included |
|
108 | - * @throws InvalidIdentifierException |
|
109 | - * @throws RuntimeException |
|
110 | - * @throws InvalidInterfaceException |
|
111 | - * @throws InvalidClassException |
|
112 | - * @throws InvalidDataTypeException |
|
113 | - */ |
|
114 | - public function __construct( |
|
115 | - $identifier, |
|
116 | - $fqcn = '', |
|
117 | - array $filters = array(), |
|
118 | - array $ingredients = array(), |
|
119 | - $type = CoffeeMaker::BREW_NEW, |
|
120 | - array $paths = array() |
|
121 | - ) { |
|
122 | - $this->setIdentifier($identifier); |
|
123 | - $this->setFilters($filters); |
|
124 | - $this->setIngredients($ingredients); |
|
125 | - $this->setType($type); |
|
126 | - $this->setPaths($paths); |
|
127 | - $this->setFqcn($fqcn); |
|
128 | - } |
|
129 | - |
|
130 | - |
|
131 | - /** |
|
132 | - * @return string |
|
133 | - */ |
|
134 | - public function identifier() |
|
135 | - { |
|
136 | - return $this->identifier; |
|
137 | - } |
|
138 | - |
|
139 | - |
|
140 | - /** |
|
141 | - * @return string |
|
142 | - */ |
|
143 | - public function fqcn() |
|
144 | - { |
|
145 | - return $this->fqcn; |
|
146 | - } |
|
147 | - |
|
148 | - |
|
149 | - /** |
|
150 | - * @return array |
|
151 | - */ |
|
152 | - public function filters() |
|
153 | - { |
|
154 | - return $this->filters; |
|
155 | - } |
|
156 | - |
|
157 | - |
|
158 | - /** |
|
159 | - * @return array |
|
160 | - */ |
|
161 | - public function ingredients() |
|
162 | - { |
|
163 | - return $this->ingredients; |
|
164 | - } |
|
165 | - |
|
166 | - |
|
167 | - /** |
|
168 | - * @return string |
|
169 | - */ |
|
170 | - public function type() |
|
171 | - { |
|
172 | - return $this->type; |
|
173 | - } |
|
174 | - |
|
175 | - |
|
176 | - /** |
|
177 | - * @return array |
|
178 | - */ |
|
179 | - public function paths() |
|
180 | - { |
|
181 | - return $this->paths; |
|
182 | - } |
|
183 | - |
|
184 | - |
|
185 | - /** |
|
186 | - * @param string $identifier Identifier for the entity class that the Recipe applies to |
|
187 | - * Typically a Fully Qualified Class Name |
|
188 | - * @throws InvalidIdentifierException |
|
189 | - */ |
|
190 | - public function setIdentifier($identifier) |
|
191 | - { |
|
192 | - if (! is_string($identifier) || empty($identifier)) { |
|
193 | - throw new InvalidIdentifierException( |
|
194 | - is_object($identifier) ? get_class($identifier) : gettype($identifier), |
|
195 | - __('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso') |
|
196 | - ); |
|
197 | - } |
|
198 | - $this->identifier = $identifier; |
|
199 | - } |
|
200 | - |
|
201 | - |
|
202 | - /** |
|
203 | - * Ensures incoming string is a valid Fully Qualified Class Name, |
|
204 | - * except if this is the default wildcard Recipe ( * ), |
|
205 | - * or it's NOT an actual FQCN because the Recipe is using filepaths |
|
206 | - * for classes that are not PSR-4 compatible |
|
207 | - * PLZ NOTE: |
|
208 | - * Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not, |
|
209 | - * therefore you should always call Recipe::setPaths() before Recipe::setFqcn() |
|
210 | - * |
|
211 | - * @param string $fqcn |
|
212 | - * @throws InvalidDataTypeException |
|
213 | - * @throws InvalidClassException |
|
214 | - * @throws InvalidInterfaceException |
|
215 | - */ |
|
216 | - public function setFqcn($fqcn) |
|
217 | - { |
|
218 | - $fqcn = ! empty($fqcn) ? $fqcn : $this->identifier; |
|
219 | - if (! is_string($fqcn)) { |
|
220 | - throw new InvalidDataTypeException( |
|
221 | - '$fqcn', |
|
222 | - is_object($fqcn) ? get_class($fqcn) : gettype($fqcn), |
|
223 | - __('string (Fully\Qualified\ClassName)', 'event_espresso') |
|
224 | - ); |
|
225 | - } |
|
226 | - $fqcn = ltrim($fqcn, '\\'); |
|
227 | - if ($fqcn !== Recipe::DEFAULT_ID |
|
228 | - && ! empty($fqcn) |
|
229 | - && empty($this->paths) |
|
230 | - && ! (class_exists($fqcn) || interface_exists($fqcn)) |
|
231 | - ) { |
|
232 | - throw new InvalidClassException($fqcn); |
|
233 | - } |
|
234 | - $this->fqcn = $fqcn; |
|
235 | - } |
|
236 | - |
|
237 | - |
|
238 | - /** |
|
239 | - * @param array $ingredients an array of dependencies where keys are the aliases and values are the FQCNs |
|
240 | - * example: |
|
241 | - * array( 'ClassInterface' => 'Fully\Qualified\ClassName' ) |
|
242 | - * @throws InvalidDataTypeException |
|
243 | - */ |
|
244 | - public function setIngredients(array $ingredients) |
|
245 | - { |
|
246 | - if (empty($ingredients)) { |
|
247 | - return; |
|
248 | - } |
|
249 | - if (! is_array($ingredients)) { |
|
250 | - throw new InvalidDataTypeException( |
|
251 | - '$ingredients', |
|
252 | - is_object($ingredients) ? get_class($ingredients) : gettype($ingredients), |
|
253 | - __('array of class dependencies', 'event_espresso') |
|
254 | - ); |
|
255 | - } |
|
256 | - $this->ingredients = array_merge($this->ingredients, $ingredients); |
|
257 | - } |
|
258 | - |
|
259 | - |
|
260 | - /** |
|
261 | - * @param string $type one of the class constants returned from CoffeeMaker::getTypes() |
|
262 | - * @throws InvalidIdentifierException |
|
263 | - */ |
|
264 | - public function setType($type = CoffeeMaker::BREW_NEW) |
|
265 | - { |
|
266 | - $this->type = CoffeeMaker::validateType($type); |
|
267 | - } |
|
268 | - |
|
269 | - |
|
270 | - /** |
|
271 | - * @param array $filters an array of filters where keys are the aliases and values are the FQCNs |
|
272 | - * example: |
|
273 | - * array( 'ClassInterface' => 'Fully\Qualified\ClassName' ) |
|
274 | - * @throws InvalidDataTypeException |
|
275 | - */ |
|
276 | - public function setFilters(array $filters) |
|
277 | - { |
|
278 | - if (empty($filters)) { |
|
279 | - return; |
|
280 | - } |
|
281 | - if (! is_array($filters)) { |
|
282 | - throw new InvalidDataTypeException( |
|
283 | - '$filters', |
|
284 | - is_object($filters) ? get_class($filters) : gettype($filters), |
|
285 | - __('array of class aliases', 'event_espresso') |
|
286 | - ); |
|
287 | - } |
|
288 | - $this->filters = array_merge($this->filters, $filters); |
|
289 | - } |
|
290 | - |
|
291 | - |
|
292 | - /** |
|
293 | - * Ensures incoming paths is a valid filepath, or array of valid filepaths, |
|
294 | - * and merges them in with any existing filepaths |
|
295 | - * PLZ NOTE: |
|
296 | - * Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not, |
|
297 | - * therefore you should always call Recipe::setPaths() before Recipe::setFqcn() |
|
298 | - * |
|
299 | - * @param string|array $paths |
|
300 | - * @throws RuntimeException |
|
301 | - * @throws InvalidDataTypeException |
|
302 | - */ |
|
303 | - public function setPaths($paths = array()) |
|
304 | - { |
|
305 | - if (empty($paths)) { |
|
306 | - return; |
|
307 | - } |
|
308 | - if (! (is_string($paths) || is_array($paths))) { |
|
309 | - throw new InvalidDataTypeException( |
|
310 | - '$path', |
|
311 | - is_object($paths) ? get_class($paths) : gettype($paths), |
|
312 | - __('string or array of strings (full server filepath(s))', 'event_espresso') |
|
313 | - ); |
|
314 | - } |
|
315 | - $paths = (array)$paths; |
|
316 | - foreach ($paths as $path) { |
|
317 | - if (strpos($path, '*') === false && ! is_readable($path)) { |
|
318 | - throw new RuntimeException( |
|
319 | - sprintf( |
|
320 | - __('The following filepath is not readable: "%1$s"', 'event_espresso'), |
|
321 | - $path |
|
322 | - ) |
|
323 | - ); |
|
324 | - } |
|
325 | - } |
|
326 | - $this->paths = array_merge($this->paths, $paths); |
|
327 | - } |
|
22 | + /** |
|
23 | + * A default Recipe to use if none is specified for a class |
|
24 | + */ |
|
25 | + const DEFAULT_ID = '*'; |
|
26 | + |
|
27 | + /** |
|
28 | + * Identifier for the entity class to be constructed. |
|
29 | + * Typically a Fully Qualified Class Name |
|
30 | + * |
|
31 | + * @var string $identifier |
|
32 | + */ |
|
33 | + private $identifier; |
|
34 | + |
|
35 | + /** |
|
36 | + * Fully Qualified Class Name |
|
37 | + * |
|
38 | + * @var string $fqcn |
|
39 | + */ |
|
40 | + private $fqcn; |
|
41 | + |
|
42 | + /** |
|
43 | + * a dependency class map array |
|
44 | + * If a Recipe is for a single class (or group of classes that shares the EXACT SAME constructor arguments), |
|
45 | + * and that class type hints for an interface, then this property allows you to configure what dependencies |
|
46 | + * get used when instantiating the class. |
|
47 | + * For example: |
|
48 | + * There's a class called Coffee, and one of its constructor arguments is BeanInterface |
|
49 | + * There are two implementations of BeanInterface: HonduranBean, and KenyanBean |
|
50 | + * We want one Coffee object to use HonduranBean for its BeanInterface, |
|
51 | + * and the 2nd Coffee object to use KenyanBean for its BeanInterface. |
|
52 | + * To do this, we need to create two Recipes: |
|
53 | + * one with an identifier of 'HonduranCoffee' using the following ingredients : |
|
54 | + * array('BeanInterface' => 'HonduranBean') |
|
55 | + * and the other with an identifier of 'KenyanCoffee' using the following ingredients : |
|
56 | + * array('BeanInterface' => 'KenyanBean') |
|
57 | + * Then, whenever the CoffeeShop brews an instance of HonduranCoffee, |
|
58 | + * an instance of HonduranBean will get injected for the BeanInterface dependency, |
|
59 | + * and whenever the CoffeeShop brews an instance of KenyanCoffee, |
|
60 | + * an instance of KenyanBean will get injected for the BeanInterface dependency |
|
61 | + * |
|
62 | + * @var array $ingredients |
|
63 | + */ |
|
64 | + private $ingredients = array(); |
|
65 | + |
|
66 | + /** |
|
67 | + * one of the class constants from CoffeeShop: |
|
68 | + * CoffeeMaker::BREW_NEW - creates a new instance |
|
69 | + * CoffeeMaker::BREW_SHARED - creates a shared instance |
|
70 | + * CoffeeMaker::BREW_LOAD_ONLY - loads but does not instantiate |
|
71 | + * |
|
72 | + * @var string $type |
|
73 | + */ |
|
74 | + private $type; |
|
75 | + |
|
76 | + /** |
|
77 | + * class name aliases - typically a Fully Qualified Interface that the class implements |
|
78 | + * identifiers passed to the CoffeeShop will be run through the filters to find the correct class name |
|
79 | + * |
|
80 | + * @var array $filters |
|
81 | + */ |
|
82 | + private $filters = array(); |
|
83 | + |
|
84 | + /** |
|
85 | + * array of full server filepaths to files that may contain the class |
|
86 | + * |
|
87 | + * @var array $paths |
|
88 | + */ |
|
89 | + private $paths = array(); |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * Recipe constructor. |
|
94 | + * |
|
95 | + * @param string $identifier class identifier, can be an alias, or FQCN, or whatever |
|
96 | + * @param string $fqcn \Fully\Qualified\ClassName, optional if $identifier is FQCN |
|
97 | + * @param array $ingredients array of dependencies that can not be resolved automatically, |
|
98 | + * used for resolving concrete classes for type hinted interfaces |
|
99 | + * for the dependencies of THIS class |
|
100 | + * @param string $type recipe type: one of the class constants on |
|
101 | + * \EventEspresso\core\services\container\CoffeeMaker |
|
102 | + * @param array $filters array of class aliases, or class interfaces |
|
103 | + * this works somewhat opposite to the $ingredients array above, |
|
104 | + * in that this array specifies interfaces or aliases |
|
105 | + * that this Recipe can be used for when resolving OTHER class's dependencies |
|
106 | + * @param array $paths if class can not be loaded via PSR-4 autoloading, |
|
107 | + * then supply a filepath, or array of filepaths, so that it can be included |
|
108 | + * @throws InvalidIdentifierException |
|
109 | + * @throws RuntimeException |
|
110 | + * @throws InvalidInterfaceException |
|
111 | + * @throws InvalidClassException |
|
112 | + * @throws InvalidDataTypeException |
|
113 | + */ |
|
114 | + public function __construct( |
|
115 | + $identifier, |
|
116 | + $fqcn = '', |
|
117 | + array $filters = array(), |
|
118 | + array $ingredients = array(), |
|
119 | + $type = CoffeeMaker::BREW_NEW, |
|
120 | + array $paths = array() |
|
121 | + ) { |
|
122 | + $this->setIdentifier($identifier); |
|
123 | + $this->setFilters($filters); |
|
124 | + $this->setIngredients($ingredients); |
|
125 | + $this->setType($type); |
|
126 | + $this->setPaths($paths); |
|
127 | + $this->setFqcn($fqcn); |
|
128 | + } |
|
129 | + |
|
130 | + |
|
131 | + /** |
|
132 | + * @return string |
|
133 | + */ |
|
134 | + public function identifier() |
|
135 | + { |
|
136 | + return $this->identifier; |
|
137 | + } |
|
138 | + |
|
139 | + |
|
140 | + /** |
|
141 | + * @return string |
|
142 | + */ |
|
143 | + public function fqcn() |
|
144 | + { |
|
145 | + return $this->fqcn; |
|
146 | + } |
|
147 | + |
|
148 | + |
|
149 | + /** |
|
150 | + * @return array |
|
151 | + */ |
|
152 | + public function filters() |
|
153 | + { |
|
154 | + return $this->filters; |
|
155 | + } |
|
156 | + |
|
157 | + |
|
158 | + /** |
|
159 | + * @return array |
|
160 | + */ |
|
161 | + public function ingredients() |
|
162 | + { |
|
163 | + return $this->ingredients; |
|
164 | + } |
|
165 | + |
|
166 | + |
|
167 | + /** |
|
168 | + * @return string |
|
169 | + */ |
|
170 | + public function type() |
|
171 | + { |
|
172 | + return $this->type; |
|
173 | + } |
|
174 | + |
|
175 | + |
|
176 | + /** |
|
177 | + * @return array |
|
178 | + */ |
|
179 | + public function paths() |
|
180 | + { |
|
181 | + return $this->paths; |
|
182 | + } |
|
183 | + |
|
184 | + |
|
185 | + /** |
|
186 | + * @param string $identifier Identifier for the entity class that the Recipe applies to |
|
187 | + * Typically a Fully Qualified Class Name |
|
188 | + * @throws InvalidIdentifierException |
|
189 | + */ |
|
190 | + public function setIdentifier($identifier) |
|
191 | + { |
|
192 | + if (! is_string($identifier) || empty($identifier)) { |
|
193 | + throw new InvalidIdentifierException( |
|
194 | + is_object($identifier) ? get_class($identifier) : gettype($identifier), |
|
195 | + __('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso') |
|
196 | + ); |
|
197 | + } |
|
198 | + $this->identifier = $identifier; |
|
199 | + } |
|
200 | + |
|
201 | + |
|
202 | + /** |
|
203 | + * Ensures incoming string is a valid Fully Qualified Class Name, |
|
204 | + * except if this is the default wildcard Recipe ( * ), |
|
205 | + * or it's NOT an actual FQCN because the Recipe is using filepaths |
|
206 | + * for classes that are not PSR-4 compatible |
|
207 | + * PLZ NOTE: |
|
208 | + * Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not, |
|
209 | + * therefore you should always call Recipe::setPaths() before Recipe::setFqcn() |
|
210 | + * |
|
211 | + * @param string $fqcn |
|
212 | + * @throws InvalidDataTypeException |
|
213 | + * @throws InvalidClassException |
|
214 | + * @throws InvalidInterfaceException |
|
215 | + */ |
|
216 | + public function setFqcn($fqcn) |
|
217 | + { |
|
218 | + $fqcn = ! empty($fqcn) ? $fqcn : $this->identifier; |
|
219 | + if (! is_string($fqcn)) { |
|
220 | + throw new InvalidDataTypeException( |
|
221 | + '$fqcn', |
|
222 | + is_object($fqcn) ? get_class($fqcn) : gettype($fqcn), |
|
223 | + __('string (Fully\Qualified\ClassName)', 'event_espresso') |
|
224 | + ); |
|
225 | + } |
|
226 | + $fqcn = ltrim($fqcn, '\\'); |
|
227 | + if ($fqcn !== Recipe::DEFAULT_ID |
|
228 | + && ! empty($fqcn) |
|
229 | + && empty($this->paths) |
|
230 | + && ! (class_exists($fqcn) || interface_exists($fqcn)) |
|
231 | + ) { |
|
232 | + throw new InvalidClassException($fqcn); |
|
233 | + } |
|
234 | + $this->fqcn = $fqcn; |
|
235 | + } |
|
236 | + |
|
237 | + |
|
238 | + /** |
|
239 | + * @param array $ingredients an array of dependencies where keys are the aliases and values are the FQCNs |
|
240 | + * example: |
|
241 | + * array( 'ClassInterface' => 'Fully\Qualified\ClassName' ) |
|
242 | + * @throws InvalidDataTypeException |
|
243 | + */ |
|
244 | + public function setIngredients(array $ingredients) |
|
245 | + { |
|
246 | + if (empty($ingredients)) { |
|
247 | + return; |
|
248 | + } |
|
249 | + if (! is_array($ingredients)) { |
|
250 | + throw new InvalidDataTypeException( |
|
251 | + '$ingredients', |
|
252 | + is_object($ingredients) ? get_class($ingredients) : gettype($ingredients), |
|
253 | + __('array of class dependencies', 'event_espresso') |
|
254 | + ); |
|
255 | + } |
|
256 | + $this->ingredients = array_merge($this->ingredients, $ingredients); |
|
257 | + } |
|
258 | + |
|
259 | + |
|
260 | + /** |
|
261 | + * @param string $type one of the class constants returned from CoffeeMaker::getTypes() |
|
262 | + * @throws InvalidIdentifierException |
|
263 | + */ |
|
264 | + public function setType($type = CoffeeMaker::BREW_NEW) |
|
265 | + { |
|
266 | + $this->type = CoffeeMaker::validateType($type); |
|
267 | + } |
|
268 | + |
|
269 | + |
|
270 | + /** |
|
271 | + * @param array $filters an array of filters where keys are the aliases and values are the FQCNs |
|
272 | + * example: |
|
273 | + * array( 'ClassInterface' => 'Fully\Qualified\ClassName' ) |
|
274 | + * @throws InvalidDataTypeException |
|
275 | + */ |
|
276 | + public function setFilters(array $filters) |
|
277 | + { |
|
278 | + if (empty($filters)) { |
|
279 | + return; |
|
280 | + } |
|
281 | + if (! is_array($filters)) { |
|
282 | + throw new InvalidDataTypeException( |
|
283 | + '$filters', |
|
284 | + is_object($filters) ? get_class($filters) : gettype($filters), |
|
285 | + __('array of class aliases', 'event_espresso') |
|
286 | + ); |
|
287 | + } |
|
288 | + $this->filters = array_merge($this->filters, $filters); |
|
289 | + } |
|
290 | + |
|
291 | + |
|
292 | + /** |
|
293 | + * Ensures incoming paths is a valid filepath, or array of valid filepaths, |
|
294 | + * and merges them in with any existing filepaths |
|
295 | + * PLZ NOTE: |
|
296 | + * Recipe::setFqcn() has a check to see if Recipe::$paths is empty or not, |
|
297 | + * therefore you should always call Recipe::setPaths() before Recipe::setFqcn() |
|
298 | + * |
|
299 | + * @param string|array $paths |
|
300 | + * @throws RuntimeException |
|
301 | + * @throws InvalidDataTypeException |
|
302 | + */ |
|
303 | + public function setPaths($paths = array()) |
|
304 | + { |
|
305 | + if (empty($paths)) { |
|
306 | + return; |
|
307 | + } |
|
308 | + if (! (is_string($paths) || is_array($paths))) { |
|
309 | + throw new InvalidDataTypeException( |
|
310 | + '$path', |
|
311 | + is_object($paths) ? get_class($paths) : gettype($paths), |
|
312 | + __('string or array of strings (full server filepath(s))', 'event_espresso') |
|
313 | + ); |
|
314 | + } |
|
315 | + $paths = (array)$paths; |
|
316 | + foreach ($paths as $path) { |
|
317 | + if (strpos($path, '*') === false && ! is_readable($path)) { |
|
318 | + throw new RuntimeException( |
|
319 | + sprintf( |
|
320 | + __('The following filepath is not readable: "%1$s"', 'event_espresso'), |
|
321 | + $path |
|
322 | + ) |
|
323 | + ); |
|
324 | + } |
|
325 | + } |
|
326 | + $this->paths = array_merge($this->paths, $paths); |
|
327 | + } |
|
328 | 328 | } |
@@ -189,7 +189,7 @@ discard block |
||
189 | 189 | */ |
190 | 190 | public function setIdentifier($identifier) |
191 | 191 | { |
192 | - if (! is_string($identifier) || empty($identifier)) { |
|
192 | + if ( ! is_string($identifier) || empty($identifier)) { |
|
193 | 193 | throw new InvalidIdentifierException( |
194 | 194 | is_object($identifier) ? get_class($identifier) : gettype($identifier), |
195 | 195 | __('class identifier (typically a \Fully\Qualified\ClassName)', 'event_espresso') |
@@ -216,7 +216,7 @@ discard block |
||
216 | 216 | public function setFqcn($fqcn) |
217 | 217 | { |
218 | 218 | $fqcn = ! empty($fqcn) ? $fqcn : $this->identifier; |
219 | - if (! is_string($fqcn)) { |
|
219 | + if ( ! is_string($fqcn)) { |
|
220 | 220 | throw new InvalidDataTypeException( |
221 | 221 | '$fqcn', |
222 | 222 | is_object($fqcn) ? get_class($fqcn) : gettype($fqcn), |
@@ -246,7 +246,7 @@ discard block |
||
246 | 246 | if (empty($ingredients)) { |
247 | 247 | return; |
248 | 248 | } |
249 | - if (! is_array($ingredients)) { |
|
249 | + if ( ! is_array($ingredients)) { |
|
250 | 250 | throw new InvalidDataTypeException( |
251 | 251 | '$ingredients', |
252 | 252 | is_object($ingredients) ? get_class($ingredients) : gettype($ingredients), |
@@ -278,7 +278,7 @@ discard block |
||
278 | 278 | if (empty($filters)) { |
279 | 279 | return; |
280 | 280 | } |
281 | - if (! is_array($filters)) { |
|
281 | + if ( ! is_array($filters)) { |
|
282 | 282 | throw new InvalidDataTypeException( |
283 | 283 | '$filters', |
284 | 284 | is_object($filters) ? get_class($filters) : gettype($filters), |
@@ -305,14 +305,14 @@ discard block |
||
305 | 305 | if (empty($paths)) { |
306 | 306 | return; |
307 | 307 | } |
308 | - if (! (is_string($paths) || is_array($paths))) { |
|
308 | + if ( ! (is_string($paths) || is_array($paths))) { |
|
309 | 309 | throw new InvalidDataTypeException( |
310 | 310 | '$path', |
311 | 311 | is_object($paths) ? get_class($paths) : gettype($paths), |
312 | 312 | __('string or array of strings (full server filepath(s))', 'event_espresso') |
313 | 313 | ); |
314 | 314 | } |
315 | - $paths = (array)$paths; |
|
315 | + $paths = (array) $paths; |
|
316 | 316 | foreach ($paths as $path) { |
317 | 317 | if (strpos($path, '*') === false && ! is_readable($path)) { |
318 | 318 | throw new RuntimeException( |
@@ -18,156 +18,156 @@ |
||
18 | 18 | abstract class CoffeeMaker implements CoffeeMakerInterface |
19 | 19 | { |
20 | 20 | |
21 | - /** |
|
22 | - * Indicates that CoffeeMaker should construct a NEW entity instance from the provided arguments (if given) |
|
23 | - */ |
|
24 | - const BREW_NEW = 'new'; |
|
25 | - |
|
26 | - /** |
|
27 | - * Indicates that CoffeeMaker should always return a SHARED instance |
|
28 | - */ |
|
29 | - const BREW_SHARED = 'shared'; |
|
30 | - |
|
31 | - /** |
|
32 | - * Indicates that CoffeeMaker should only load the file/class/interface but NOT instantiate |
|
33 | - */ |
|
34 | - const BREW_LOAD_ONLY = 'load_only'; |
|
35 | - |
|
36 | - |
|
37 | - /** |
|
38 | - * @var CoffeePotInterface $coffee_pot |
|
39 | - */ |
|
40 | - private $coffee_pot; |
|
41 | - |
|
42 | - /** |
|
43 | - * @var DependencyInjector $injector |
|
44 | - */ |
|
45 | - private $injector; |
|
46 | - |
|
47 | - |
|
48 | - /** |
|
49 | - * @return array |
|
50 | - */ |
|
51 | - public static function getTypes() |
|
52 | - { |
|
53 | - return (array)apply_filters( |
|
54 | - 'FHEE__EventEspresso\core\services\container\CoffeeMaker__getTypes', |
|
55 | - array( |
|
56 | - CoffeeMaker::BREW_NEW, |
|
57 | - CoffeeMaker::BREW_SHARED, |
|
58 | - CoffeeMaker::BREW_LOAD_ONLY, |
|
59 | - ) |
|
60 | - ); |
|
61 | - } |
|
62 | - |
|
63 | - |
|
64 | - /** |
|
65 | - * @param $type |
|
66 | - * @throws \EventEspresso\core\exceptions\InvalidIdentifierException |
|
67 | - */ |
|
68 | - public static function validateType($type) |
|
69 | - { |
|
70 | - $types = CoffeeMaker::getTypes(); |
|
71 | - if (! in_array($type, $types, true)) { |
|
72 | - throw new InvalidIdentifierException( |
|
73 | - is_object($type) ? get_class($type) : gettype($type), |
|
74 | - __( |
|
75 | - 'recipe type (one of the class constants on \EventEspresso\core\services\container\CoffeeMaker)', |
|
76 | - 'event_espresso' |
|
77 | - ) |
|
78 | - ); |
|
79 | - } |
|
80 | - return $type; |
|
81 | - } |
|
82 | - |
|
83 | - |
|
84 | - /** |
|
85 | - * CoffeeMaker constructor. |
|
86 | - * |
|
87 | - * @param CoffeePotInterface $coffee_pot |
|
88 | - * @param InjectorInterface $injector |
|
89 | - */ |
|
90 | - public function __construct(CoffeePotInterface $coffee_pot, InjectorInterface $injector) |
|
91 | - { |
|
92 | - $this->coffee_pot = $coffee_pot; |
|
93 | - $this->injector = $injector; |
|
94 | - } |
|
95 | - |
|
96 | - |
|
97 | - /** |
|
98 | - * @return \EventEspresso\core\services\container\CoffeePotInterface |
|
99 | - */ |
|
100 | - protected function coffeePot() |
|
101 | - { |
|
102 | - return $this->coffee_pot; |
|
103 | - } |
|
104 | - |
|
105 | - |
|
106 | - /** |
|
107 | - * @return \EventEspresso\core\services\container\DependencyInjector |
|
108 | - */ |
|
109 | - protected function injector() |
|
110 | - { |
|
111 | - return $this->injector; |
|
112 | - } |
|
113 | - |
|
114 | - |
|
115 | - /** |
|
116 | - * Examines the constructor to determine which method should be used for instantiation |
|
117 | - * |
|
118 | - * @param \ReflectionClass $reflector |
|
119 | - * @return mixed |
|
120 | - * @throws InstantiationException |
|
121 | - */ |
|
122 | - protected function resolveInstantiationMethod(\ReflectionClass $reflector) |
|
123 | - { |
|
124 | - if ($reflector->getConstructor() === null) { |
|
125 | - return 'NewInstance'; |
|
126 | - } |
|
127 | - if ($reflector->isInstantiable()) { |
|
128 | - return 'NewInstanceArgs'; |
|
129 | - } |
|
130 | - if (method_exists($reflector->getName(), 'instance')) { |
|
131 | - return 'instance'; |
|
132 | - } |
|
133 | - if (method_exists($reflector->getName(), 'new_instance')) { |
|
134 | - return 'new_instance'; |
|
135 | - } |
|
136 | - if (method_exists($reflector->getName(), 'new_instance_from_db')) { |
|
137 | - return 'new_instance_from_db'; |
|
138 | - } |
|
139 | - throw new InstantiationException($reflector->getName()); |
|
140 | - } |
|
141 | - |
|
142 | - |
|
143 | - /** |
|
144 | - * Ensures files for classes that are not PSR-4 compatible are loaded |
|
145 | - * and then verifies that classes exist where applicable |
|
146 | - * |
|
147 | - * @param RecipeInterface $recipe |
|
148 | - * @return bool |
|
149 | - * @throws InvalidClassException |
|
150 | - */ |
|
151 | - protected function resolveClassAndFilepath(RecipeInterface $recipe) |
|
152 | - { |
|
153 | - $paths = $recipe->paths(); |
|
154 | - if (! empty($paths)) { |
|
155 | - foreach ($paths as $path) { |
|
156 | - if (strpos($path, '*') === false && is_readable($path)) { |
|
157 | - require_once($path); |
|
158 | - } |
|
159 | - } |
|
160 | - } |
|
161 | - // re: using "false" for class_exists() second param: |
|
162 | - // if a class name is not already known to PHP, then class_exists() will run through |
|
163 | - // all of the registered spl_autoload functions until it either finds the class, |
|
164 | - // or gets to the end of the registered spl_autoload functions. |
|
165 | - // When the second parameter is true, it will also attempt to load the class file, |
|
166 | - // but it will also trigger an error if the class can not be loaded. |
|
167 | - // We don't want that extra error in the mix, so we have set the second param to "false" |
|
168 | - if ($recipe->type() !== CoffeeMaker::BREW_LOAD_ONLY && ! class_exists($recipe->fqcn(), false)) { |
|
169 | - throw new InvalidClassException($recipe->identifier()); |
|
170 | - } |
|
171 | - return true; |
|
172 | - } |
|
21 | + /** |
|
22 | + * Indicates that CoffeeMaker should construct a NEW entity instance from the provided arguments (if given) |
|
23 | + */ |
|
24 | + const BREW_NEW = 'new'; |
|
25 | + |
|
26 | + /** |
|
27 | + * Indicates that CoffeeMaker should always return a SHARED instance |
|
28 | + */ |
|
29 | + const BREW_SHARED = 'shared'; |
|
30 | + |
|
31 | + /** |
|
32 | + * Indicates that CoffeeMaker should only load the file/class/interface but NOT instantiate |
|
33 | + */ |
|
34 | + const BREW_LOAD_ONLY = 'load_only'; |
|
35 | + |
|
36 | + |
|
37 | + /** |
|
38 | + * @var CoffeePotInterface $coffee_pot |
|
39 | + */ |
|
40 | + private $coffee_pot; |
|
41 | + |
|
42 | + /** |
|
43 | + * @var DependencyInjector $injector |
|
44 | + */ |
|
45 | + private $injector; |
|
46 | + |
|
47 | + |
|
48 | + /** |
|
49 | + * @return array |
|
50 | + */ |
|
51 | + public static function getTypes() |
|
52 | + { |
|
53 | + return (array)apply_filters( |
|
54 | + 'FHEE__EventEspresso\core\services\container\CoffeeMaker__getTypes', |
|
55 | + array( |
|
56 | + CoffeeMaker::BREW_NEW, |
|
57 | + CoffeeMaker::BREW_SHARED, |
|
58 | + CoffeeMaker::BREW_LOAD_ONLY, |
|
59 | + ) |
|
60 | + ); |
|
61 | + } |
|
62 | + |
|
63 | + |
|
64 | + /** |
|
65 | + * @param $type |
|
66 | + * @throws \EventEspresso\core\exceptions\InvalidIdentifierException |
|
67 | + */ |
|
68 | + public static function validateType($type) |
|
69 | + { |
|
70 | + $types = CoffeeMaker::getTypes(); |
|
71 | + if (! in_array($type, $types, true)) { |
|
72 | + throw new InvalidIdentifierException( |
|
73 | + is_object($type) ? get_class($type) : gettype($type), |
|
74 | + __( |
|
75 | + 'recipe type (one of the class constants on \EventEspresso\core\services\container\CoffeeMaker)', |
|
76 | + 'event_espresso' |
|
77 | + ) |
|
78 | + ); |
|
79 | + } |
|
80 | + return $type; |
|
81 | + } |
|
82 | + |
|
83 | + |
|
84 | + /** |
|
85 | + * CoffeeMaker constructor. |
|
86 | + * |
|
87 | + * @param CoffeePotInterface $coffee_pot |
|
88 | + * @param InjectorInterface $injector |
|
89 | + */ |
|
90 | + public function __construct(CoffeePotInterface $coffee_pot, InjectorInterface $injector) |
|
91 | + { |
|
92 | + $this->coffee_pot = $coffee_pot; |
|
93 | + $this->injector = $injector; |
|
94 | + } |
|
95 | + |
|
96 | + |
|
97 | + /** |
|
98 | + * @return \EventEspresso\core\services\container\CoffeePotInterface |
|
99 | + */ |
|
100 | + protected function coffeePot() |
|
101 | + { |
|
102 | + return $this->coffee_pot; |
|
103 | + } |
|
104 | + |
|
105 | + |
|
106 | + /** |
|
107 | + * @return \EventEspresso\core\services\container\DependencyInjector |
|
108 | + */ |
|
109 | + protected function injector() |
|
110 | + { |
|
111 | + return $this->injector; |
|
112 | + } |
|
113 | + |
|
114 | + |
|
115 | + /** |
|
116 | + * Examines the constructor to determine which method should be used for instantiation |
|
117 | + * |
|
118 | + * @param \ReflectionClass $reflector |
|
119 | + * @return mixed |
|
120 | + * @throws InstantiationException |
|
121 | + */ |
|
122 | + protected function resolveInstantiationMethod(\ReflectionClass $reflector) |
|
123 | + { |
|
124 | + if ($reflector->getConstructor() === null) { |
|
125 | + return 'NewInstance'; |
|
126 | + } |
|
127 | + if ($reflector->isInstantiable()) { |
|
128 | + return 'NewInstanceArgs'; |
|
129 | + } |
|
130 | + if (method_exists($reflector->getName(), 'instance')) { |
|
131 | + return 'instance'; |
|
132 | + } |
|
133 | + if (method_exists($reflector->getName(), 'new_instance')) { |
|
134 | + return 'new_instance'; |
|
135 | + } |
|
136 | + if (method_exists($reflector->getName(), 'new_instance_from_db')) { |
|
137 | + return 'new_instance_from_db'; |
|
138 | + } |
|
139 | + throw new InstantiationException($reflector->getName()); |
|
140 | + } |
|
141 | + |
|
142 | + |
|
143 | + /** |
|
144 | + * Ensures files for classes that are not PSR-4 compatible are loaded |
|
145 | + * and then verifies that classes exist where applicable |
|
146 | + * |
|
147 | + * @param RecipeInterface $recipe |
|
148 | + * @return bool |
|
149 | + * @throws InvalidClassException |
|
150 | + */ |
|
151 | + protected function resolveClassAndFilepath(RecipeInterface $recipe) |
|
152 | + { |
|
153 | + $paths = $recipe->paths(); |
|
154 | + if (! empty($paths)) { |
|
155 | + foreach ($paths as $path) { |
|
156 | + if (strpos($path, '*') === false && is_readable($path)) { |
|
157 | + require_once($path); |
|
158 | + } |
|
159 | + } |
|
160 | + } |
|
161 | + // re: using "false" for class_exists() second param: |
|
162 | + // if a class name is not already known to PHP, then class_exists() will run through |
|
163 | + // all of the registered spl_autoload functions until it either finds the class, |
|
164 | + // or gets to the end of the registered spl_autoload functions. |
|
165 | + // When the second parameter is true, it will also attempt to load the class file, |
|
166 | + // but it will also trigger an error if the class can not be loaded. |
|
167 | + // We don't want that extra error in the mix, so we have set the second param to "false" |
|
168 | + if ($recipe->type() !== CoffeeMaker::BREW_LOAD_ONLY && ! class_exists($recipe->fqcn(), false)) { |
|
169 | + throw new InvalidClassException($recipe->identifier()); |
|
170 | + } |
|
171 | + return true; |
|
172 | + } |
|
173 | 173 | } |
@@ -50,7 +50,7 @@ discard block |
||
50 | 50 | */ |
51 | 51 | public static function getTypes() |
52 | 52 | { |
53 | - return (array)apply_filters( |
|
53 | + return (array) apply_filters( |
|
54 | 54 | 'FHEE__EventEspresso\core\services\container\CoffeeMaker__getTypes', |
55 | 55 | array( |
56 | 56 | CoffeeMaker::BREW_NEW, |
@@ -68,7 +68,7 @@ discard block |
||
68 | 68 | public static function validateType($type) |
69 | 69 | { |
70 | 70 | $types = CoffeeMaker::getTypes(); |
71 | - if (! in_array($type, $types, true)) { |
|
71 | + if ( ! in_array($type, $types, true)) { |
|
72 | 72 | throw new InvalidIdentifierException( |
73 | 73 | is_object($type) ? get_class($type) : gettype($type), |
74 | 74 | __( |
@@ -151,7 +151,7 @@ discard block |
||
151 | 151 | protected function resolveClassAndFilepath(RecipeInterface $recipe) |
152 | 152 | { |
153 | 153 | $paths = $recipe->paths(); |
154 | - if (! empty($paths)) { |
|
154 | + if ( ! empty($paths)) { |
|
155 | 155 | foreach ($paths as $path) { |
156 | 156 | if (strpos($path, '*') === false && is_readable($path)) { |
157 | 157 | require_once($path); |