Test Failed
Push — master ( 275d9f...e3cf61 )
by Alain
02:01
created
src/View/View/AbstractView.php 1 patch
Indentation   +209 added lines, -209 removed lines patch added patch discarded remove patch
@@ -31,233 +31,233 @@
 block discarded – undo
31 31
 abstract class AbstractView implements View
32 32
 {
33 33
 
34
-    /**
35
-     * URI of the view.
36
-     *
37
-     * The underscores are used to prevent accidental use of these properties from within the rendering closure.
38
-     *
39
-     * @since 0.1.0
40
-     *
41
-     * @var string
42
-     */
43
-    protected $_uri_;
34
+	/**
35
+	 * URI of the view.
36
+	 *
37
+	 * The underscores are used to prevent accidental use of these properties from within the rendering closure.
38
+	 *
39
+	 * @since 0.1.0
40
+	 *
41
+	 * @var string
42
+	 */
43
+	protected $_uri_;
44 44
 
45
-    /**
46
-     * Engine to use for the view.
47
-     *
48
-     * The underscores are used to prevent accidental use of these properties from within the rendering closure.
49
-     *
50
-     * @since 0.1.0
51
-     *
52
-     * @var Engine
53
-     */
54
-    protected $_engine_;
45
+	/**
46
+	 * Engine to use for the view.
47
+	 *
48
+	 * The underscores are used to prevent accidental use of these properties from within the rendering closure.
49
+	 *
50
+	 * @since 0.1.0
51
+	 *
52
+	 * @var Engine
53
+	 */
54
+	protected $_engine_;
55 55
 
56
-    /**
57
-     * ViewBuilder instance.
58
-     *
59
-     * The underscores are used to prevent accidental use of these properties from within the rendering closure.
60
-     *
61
-     * @since 0.2.0
62
-     *
63
-     * @var ViewBuilder
64
-     */
65
-    protected $_builder_;
56
+	/**
57
+	 * ViewBuilder instance.
58
+	 *
59
+	 * The underscores are used to prevent accidental use of these properties from within the rendering closure.
60
+	 *
61
+	 * @since 0.2.0
62
+	 *
63
+	 * @var ViewBuilder
64
+	 */
65
+	protected $_builder_;
66 66
 
67
-    /**
68
-     * The context with which the view will be rendered.
69
-     *
70
-     * The underscores are used to prevent accidental use of these properties from within the rendering closure.
71
-     *
72
-     * @since 0.4.0
73
-     *
74
-     * @var array
75
-     */
76
-    protected $_context_;
67
+	/**
68
+	 * The context with which the view will be rendered.
69
+	 *
70
+	 * The underscores are used to prevent accidental use of these properties from within the rendering closure.
71
+	 *
72
+	 * @since 0.4.0
73
+	 *
74
+	 * @var array
75
+	 */
76
+	protected $_context_;
77 77
 
78
-    /**
79
-     * Instantiate an AbstractView object.
80
-     *
81
-     * @since 0.1.0
82
-     *
83
-     * @param string      $uri         URI for the view.
84
-     * @param Engine      $engine      Engine to use for the view.
85
-     * @param ViewBuilder $viewBuilder View builder instance to use.
86
-     * @param array       $context     Initial context to use.
87
-     */
88
-    public function __construct(string $uri, Engine $engine, ViewBuilder $viewBuilder = null, array $context = [])
89
-    {
90
-        $this->_uri_     = $uri;
91
-        $this->_engine_  = $engine;
92
-        $this->_builder_ = $viewBuilder ?? Views::getViewBuilder();
93
-        $this->_context_ = $context;
94
-    }
78
+	/**
79
+	 * Instantiate an AbstractView object.
80
+	 *
81
+	 * @since 0.1.0
82
+	 *
83
+	 * @param string      $uri         URI for the view.
84
+	 * @param Engine      $engine      Engine to use for the view.
85
+	 * @param ViewBuilder $viewBuilder View builder instance to use.
86
+	 * @param array       $context     Initial context to use.
87
+	 */
88
+	public function __construct(string $uri, Engine $engine, ViewBuilder $viewBuilder = null, array $context = [])
89
+	{
90
+		$this->_uri_     = $uri;
91
+		$this->_engine_  = $engine;
92
+		$this->_builder_ = $viewBuilder ?? Views::getViewBuilder();
93
+		$this->_context_ = $context;
94
+	}
95 95
 
96
-    /**
97
-     * Render the view.
98
-     *
99
-     * @since 0.1.0
100
-     *
101
-     * @param array $context Optional. The context in which to render the view.
102
-     * @param bool  $echo    Optional. Whether to echo the output immediately. Defaults to false.
103
-     *
104
-     * @return string Rendered HTML.
105
-     * @throws FailedToProcessConfigException If the Config could not be processed.
106
-     */
107
-    public function render(array $context = [], bool $echo = false): string
108
-    {
109
-        $this->assimilateContext($context);
96
+	/**
97
+	 * Render the view.
98
+	 *
99
+	 * @since 0.1.0
100
+	 *
101
+	 * @param array $context Optional. The context in which to render the view.
102
+	 * @param bool  $echo    Optional. Whether to echo the output immediately. Defaults to false.
103
+	 *
104
+	 * @return string Rendered HTML.
105
+	 * @throws FailedToProcessConfigException If the Config could not be processed.
106
+	 */
107
+	public function render(array $context = [], bool $echo = false): string
108
+	{
109
+		$this->assimilateContext($context);
110 110
 
111
-        $closure = Closure::bind(
112
-            $this->_engine_->getRenderCallback($this->_uri_, $context),
113
-            $this,
114
-            static::class
115
-        );
111
+		$closure = Closure::bind(
112
+			$this->_engine_->getRenderCallback($this->_uri_, $context),
113
+			$this,
114
+			static::class
115
+		);
116 116
 
117
-        $output = $closure();
117
+		$output = $closure();
118 118
 
119
-        if ($echo) {
120
-            echo $output;
121
-        }
119
+		if ($echo) {
120
+			echo $output;
121
+		}
122 122
 
123
-        return $output;
124
-    }
123
+		return $output;
124
+	}
125 125
 
126
-    /**
127
-     * Render a partial view (or section) for a given URI.
128
-     *
129
-     * @since 0.2.0
130
-     *
131
-     * @param string      $view    View identifier to create a view for.
132
-     * @param array       $context Optional. The context in which to render the view.
133
-     * @param string|null $type    Type of view to create.
134
-     *
135
-     * @return string Rendered HTML content.
136
-     * @throws FailedToProcessConfigException If the Config could not be processed.
137
-     * @throws FailedToInstantiateView If the View could not be instantiated.
138
-     */
139
-    public function section(string $view, array $context = null, $type = null): string
140
-    {
141
-        $context = (null === $context)
142
-            ? $this->_context_
143
-            : array_merge($this->_context_, $context);
126
+	/**
127
+	 * Render a partial view (or section) for a given URI.
128
+	 *
129
+	 * @since 0.2.0
130
+	 *
131
+	 * @param string      $view    View identifier to create a view for.
132
+	 * @param array       $context Optional. The context in which to render the view.
133
+	 * @param string|null $type    Type of view to create.
134
+	 *
135
+	 * @return string Rendered HTML content.
136
+	 * @throws FailedToProcessConfigException If the Config could not be processed.
137
+	 * @throws FailedToInstantiateView If the View could not be instantiated.
138
+	 */
139
+	public function section(string $view, array $context = null, $type = null): string
140
+	{
141
+		$context = (null === $context)
142
+			? $this->_context_
143
+			: array_merge($this->_context_, $context);
144 144
 
145
-        $viewObject = $this->_builder_->create($view, $type);
145
+		$viewObject = $this->_builder_->create($view, $type);
146 146
 
147
-        return $viewObject->render($context);
148
-    }
147
+		return $viewObject->render($context);
148
+	}
149 149
 
150
-    /**
151
-     * Get the entire array of contextual data.
152
-     *
153
-     * @since 0.4.0
154
-     *
155
-     * @return array Array of contextual data.
156
-     */
157
-    public function getContext(): array
158
-    {
159
-        return $this->_context_;
160
-    }
150
+	/**
151
+	 * Get the entire array of contextual data.
152
+	 *
153
+	 * @since 0.4.0
154
+	 *
155
+	 * @return array Array of contextual data.
156
+	 */
157
+	public function getContext(): array
158
+	{
159
+		return $this->_context_;
160
+	}
161 161
 
162
-    /**
163
-     * Add information to the context.
164
-     *
165
-     * @param string $key      Context key to add.
166
-     * @param mixed  $value    Value to add under the given key.
167
-     * @param string $behavior Behavior to use for adapting the context.
168
-     * @return View
169
-     */
170
-    public function addToContext( string $key, $value, string $behavior ): View
171
-    {
172
-        switch ($behavior) {
173
-            case View::REPLACE:
174
-                $this->_context_[$key] = $value;
175
-                return $this;
176
-            case View::MERGE:
177
-                if(array_key_exists($key, $this->_context_)) {
178
-                    $this->_context_ = array_merge_recursive($this->_context_, [$key => $value]);
179
-                    return $this;
180
-                }
181
-                $this->_context_[$key] = $value;
182
-                return $this;
183
-            case View::ADD_ONLY:
184
-                if (array_key_exists($key, $this->_context_)) {
185
-                    return $this;
186
-                }
187
-                $this->_context_[$key] = $value;
188
-                return $this;
189
-            case View::REPLACE_ONLY:
190
-                if (! array_key_exists($key, $this->_context_)) {
191
-                    return $this;
192
-                }
193
-                $this->_context_[$key] = $value;
194
-                return $this;
195
-            case View::MERGE_ONLY:
196
-                if (! array_key_exists($key, $this->_context_)) {
197
-                    return $this;
198
-                }
199
-                $this->_context_ = array_merge_recursive($this->_context_, [$key => $value]);
200
-                return $this;
201
-            default:
202
-                throw new InvalidContextAddingBehavior(
203
-                    sprintf(
204
-                        _('Invalid behavior "%s" for adding to the context of view "%s".'),
205
-                        $key,
206
-                        $this->_uri_
207
-                    )
208
-                );
209
-        }
210
-    }
162
+	/**
163
+	 * Add information to the context.
164
+	 *
165
+	 * @param string $key      Context key to add.
166
+	 * @param mixed  $value    Value to add under the given key.
167
+	 * @param string $behavior Behavior to use for adapting the context.
168
+	 * @return View
169
+	 */
170
+	public function addToContext( string $key, $value, string $behavior ): View
171
+	{
172
+		switch ($behavior) {
173
+			case View::REPLACE:
174
+				$this->_context_[$key] = $value;
175
+				return $this;
176
+			case View::MERGE:
177
+				if(array_key_exists($key, $this->_context_)) {
178
+					$this->_context_ = array_merge_recursive($this->_context_, [$key => $value]);
179
+					return $this;
180
+				}
181
+				$this->_context_[$key] = $value;
182
+				return $this;
183
+			case View::ADD_ONLY:
184
+				if (array_key_exists($key, $this->_context_)) {
185
+					return $this;
186
+				}
187
+				$this->_context_[$key] = $value;
188
+				return $this;
189
+			case View::REPLACE_ONLY:
190
+				if (! array_key_exists($key, $this->_context_)) {
191
+					return $this;
192
+				}
193
+				$this->_context_[$key] = $value;
194
+				return $this;
195
+			case View::MERGE_ONLY:
196
+				if (! array_key_exists($key, $this->_context_)) {
197
+					return $this;
198
+				}
199
+				$this->_context_ = array_merge_recursive($this->_context_, [$key => $value]);
200
+				return $this;
201
+			default:
202
+				throw new InvalidContextAddingBehavior(
203
+					sprintf(
204
+						_('Invalid behavior "%s" for adding to the context of view "%s".'),
205
+						$key,
206
+						$this->_uri_
207
+					)
208
+				);
209
+		}
210
+	}
211 211
 
212
-    /**
213
-     * Associate a view builder with this view.
214
-     *
215
-     * @since 0.2.0
216
-     *
217
-     * @param ViewBuilder $builder
218
-     *
219
-     * @return View
220
-     */
221
-    public function setBuilder(ViewBuilder $builder): View
222
-    {
223
-        $this->_builder_ = $builder;
212
+	/**
213
+	 * Associate a view builder with this view.
214
+	 *
215
+	 * @since 0.2.0
216
+	 *
217
+	 * @param ViewBuilder $builder
218
+	 *
219
+	 * @return View
220
+	 */
221
+	public function setBuilder(ViewBuilder $builder): View
222
+	{
223
+		$this->_builder_ = $builder;
224 224
 
225
-        return $this;
226
-    }
225
+		return $this;
226
+	}
227 227
 
228
-    /**
229
-     * Assimilate the context to make it available as properties.
230
-     *
231
-     * @since 0.2.0
232
-     *
233
-     * @param array $context Context to assimilate.
234
-     */
235
-    protected function assimilateContext(array $context = [])
236
-    {
237
-        $this->_context_ = $context;
238
-        foreach ($context as $key => $value) {
239
-            $this->$key = $value;
240
-        }
241
-    }
228
+	/**
229
+	 * Assimilate the context to make it available as properties.
230
+	 *
231
+	 * @since 0.2.0
232
+	 *
233
+	 * @param array $context Context to assimilate.
234
+	 */
235
+	protected function assimilateContext(array $context = [])
236
+	{
237
+		$this->_context_ = $context;
238
+		foreach ($context as $key => $value) {
239
+			$this->$key = $value;
240
+		}
241
+	}
242 242
 
243
-    /**
244
-     * Turn invokable objects as properties into methods of the view.
245
-     *
246
-     * @param string $method    Method that was called on the view.
247
-     * @param array  $arguments Array of arguments that were used.
248
-     * @return mixed Return value of the invokable object.
249
-     */
250
-    public function __call($method, $arguments) {
251
-        if ( ! property_exists($this, $method)
252
-             || ! is_callable($this->$method)) {
253
-            trigger_error(
254
-                "Call to undefined method {$method} on a view.",
255
-                E_USER_ERROR
256
-            );
257
-        }
243
+	/**
244
+	 * Turn invokable objects as properties into methods of the view.
245
+	 *
246
+	 * @param string $method    Method that was called on the view.
247
+	 * @param array  $arguments Array of arguments that were used.
248
+	 * @return mixed Return value of the invokable object.
249
+	 */
250
+	public function __call($method, $arguments) {
251
+		if ( ! property_exists($this, $method)
252
+			 || ! is_callable($this->$method)) {
253
+			trigger_error(
254
+				"Call to undefined method {$method} on a view.",
255
+				E_USER_ERROR
256
+			);
257
+		}
258 258
 
259
-        $callable = $this->$method;
259
+		$callable = $this->$method;
260 260
 
261
-        return $callable(...$arguments);
262
-    }
261
+		return $callable(...$arguments);
262
+	}
263 263
 }
Please login to merge, or discard this patch.
src/View/ViewBuilder.php 1 patch
Indentation   +300 added lines, -300 removed lines patch added patch discarded remove patch
@@ -33,305 +33,305 @@
 block discarded – undo
33 33
 class ViewBuilder
34 34
 {
35 35
 
36
-    use ConfigTrait;
37
-
38
-    const ENGINE_FINDER_KEY = 'EngineFinder';
39
-    const VIEW_FINDER_KEY = 'ViewFinder';
40
-
41
-    /**
42
-     * BaseViewFinder instance.
43
-     *
44
-     * @since 0.1.0
45
-     *
46
-     * @var ViewFinder
47
-     */
48
-    protected $viewFinder;
49
-
50
-    /**
51
-     * BaseEngineFinder instance.
52
-     *
53
-     * @since 0.1.0
54
-     *
55
-     * @var EngineFinder
56
-     */
57
-    protected $engineFinder;
58
-
59
-    /**
60
-     * Locations to scan for views.
61
-     *
62
-     * @since 0.1.0
63
-     *
64
-     * @var Locations
65
-     */
66
-    protected $locations;
67
-
68
-    /**
69
-     * Cache of already resolved view paths.
70
-     *
71
-     * @since 0.4.6
72
-     *
73
-     * @var string[]
74
-     */
75
-    protected $viewPathCache = [];
76
-
77
-    /**
78
-     * Instantiate a ViewBuilder object.
79
-     *
80
-     * @since 0.1.0
81
-     *
82
-     * @param ConfigInterface   $config       Optional. Configuration settings.
83
-     * @param ViewFinder|null   $viewFinder   Optional. ViewFinder instance.
84
-     * @param EngineFinder|null $engineFinder Optional. EngineFinder instance.
85
-     *
86
-     * @throws FailedToProcessConfigException If the config could not be processed.
87
-     */
88
-    public function __construct(
89
-        ConfigInterface $config = null,
90
-        ViewFinder $viewFinder = null,
91
-        EngineFinder $engineFinder = null
92
-    ) {
93
-        $this->processConfig($this->getConfig($config));
94
-        $this->viewFinder   = $viewFinder ?? $this->getViewFinder();
95
-        $this->engineFinder = $engineFinder ?? $this->getEngineFinder();
96
-        $this->locations    = new Locations();
97
-    }
98
-
99
-    /**
100
-     * Create a new view for a given URI.
101
-     *
102
-     * @since 0.1.0
103
-     *
104
-     * @param string $view View identifier to create a view for.
105
-     * @param mixed  $type Type of view to create.
106
-     *
107
-     * @return View Instance of the requested view.
108
-     * @throws FailedToInstantiateView If the view could not be instantiated.
109
-     */
110
-    public function create(string $view, $type = null): View
111
-    {
112
-        if (!array_key_exists($view, $this->viewPathCache)) {
113
-            $uri    = $this->scanLocations([$view]);
114
-            $engine = $uri ? $this->getEngine($uri) : false;
115
-
116
-            $this->viewPathCache[$view]           = [];
117
-            $this->viewPathCache[$view]['uri']    = $uri;
118
-            $this->viewPathCache[$view]['engine'] = $engine;
119
-
120
-            if ($type===null) {
121
-                $this->viewPathCache[$view]['view'] = $uri
122
-                    ? $this->getView($uri, $engine)
123
-                    : false;
124
-            }
125
-        } else {
126
-            $uri    = $this->viewPathCache[$view]['uri'];
127
-            $engine = $this->viewPathCache[$view]['engine'];
128
-        }
129
-
130
-
131
-        if (!$uri || !$engine) {
132
-            return $this->getViewFinder()->getNullObject();
133
-        }
134
-
135
-        if ($type === null) {
136
-            return $this->viewPathCache[$view]['view'];
137
-        }
138
-
139
-        return $this->getView($uri, $engine, $type);
140
-    }
141
-
142
-    /**
143
-     * Get an Engine that can deal with the given URI.
144
-     *
145
-     * @since 0.1.0
146
-     *
147
-     * @param string $uri URI to get an engine for.
148
-     *
149
-     * @return Engine Instance of an engine that can deal with the given URI.
150
-     */
151
-    public function getEngine(string $uri): Engine
152
-    {
153
-        return $this->getEngineFinder()->find([$uri]);
154
-    }
155
-
156
-    /**
157
-     * Get a view for a given URI, engine and type.
158
-     *
159
-     * @since 0.1.0
160
-     *
161
-     * @param string $uri    URI to get a view for.
162
-     * @param Engine $engine Engine to use for the view.
163
-     * @param mixed  $type   Type of view to get.
164
-     *
165
-     * @return View View that matches the given requirements.
166
-     * @throws FailedToInstantiateView If the view could not be instantiated.
167
-     */
168
-    public function getView(string $uri, Engine $engine, $type = null): View
169
-    {
170
-        if (null === $type) {
171
-            $view = $this->getViewFinder()->find([$uri], $engine);
172
-            return $view->setBuilder( $this );
173
-        }
174
-
175
-        return $this->resolveType($type, $uri, $engine);
176
-    }
177
-
178
-    /**
179
-     * Get the ViewFinder instance.
180
-     *
181
-     * @since 0.1.0
182
-     *
183
-     * @return ViewFinder Instance of a BaseViewFinder.
184
-     */
185
-    public function getViewFinder(): ViewFinder
186
-    {
187
-        return $this->viewFinder ?? $this->getFinder(static::VIEW_FINDER_KEY);
188
-    }
189
-
190
-    /**
191
-     * Get the EngineFinder instance.
192
-     *
193
-     * @since 0.1.0
194
-     *
195
-     * @return EngineFinder Instance of a BaseEngineFinder.
196
-     */
197
-    public function getEngineFinder(): EngineFinder
198
-    {
199
-        return $this->engineFinder ?? $this->getFinder(static::ENGINE_FINDER_KEY);
200
-    }
201
-
202
-    /**
203
-     * Add a location to scan with the BaseViewFinder.
204
-     *
205
-     * @since 0.1.0
206
-     *
207
-     * @param Location $location Location to scan with the BaseViewFinder.
208
-     *
209
-     * @return static
210
-     */
211
-    public function addLocation(Location $location)
212
-    {
213
-        $this->locations->add($location);
214
-
215
-        unset( $this->viewPathCache );
216
-        $this->viewPathCache = [];
217
-
218
-        return $this;
219
-    }
220
-
221
-    /**
222
-     * Get the collection of locations registered with this ViewBuilder.
223
-     *
224
-     * @since 0.1.3
225
-     *
226
-     * @return Locations Collection of locations.
227
-     */
228
-    public function getLocations()
229
-    {
230
-        return $this->locations;
231
-    }
232
-
233
-    /**
234
-     * Scan Locations for an URI that matches the specified criteria.
235
-     *
236
-     * @since 0.1.0
237
-     *
238
-     * @param array $criteria Criteria to match.
239
-     *
240
-     * @return string|false URI of the requested view, or false if not found.
241
-     */
242
-    public function scanLocations(array $criteria)
243
-    {
244
-        $uris = $this->locations->map(function ($location) use ($criteria) {
245
-            /** @var Location $location */
246
-            return $location->getURI($criteria);
247
-        })->filter(function ($uri) {
248
-            return false !== $uri;
249
-        });
36
+	use ConfigTrait;
37
+
38
+	const ENGINE_FINDER_KEY = 'EngineFinder';
39
+	const VIEW_FINDER_KEY = 'ViewFinder';
40
+
41
+	/**
42
+	 * BaseViewFinder instance.
43
+	 *
44
+	 * @since 0.1.0
45
+	 *
46
+	 * @var ViewFinder
47
+	 */
48
+	protected $viewFinder;
49
+
50
+	/**
51
+	 * BaseEngineFinder instance.
52
+	 *
53
+	 * @since 0.1.0
54
+	 *
55
+	 * @var EngineFinder
56
+	 */
57
+	protected $engineFinder;
58
+
59
+	/**
60
+	 * Locations to scan for views.
61
+	 *
62
+	 * @since 0.1.0
63
+	 *
64
+	 * @var Locations
65
+	 */
66
+	protected $locations;
67
+
68
+	/**
69
+	 * Cache of already resolved view paths.
70
+	 *
71
+	 * @since 0.4.6
72
+	 *
73
+	 * @var string[]
74
+	 */
75
+	protected $viewPathCache = [];
76
+
77
+	/**
78
+	 * Instantiate a ViewBuilder object.
79
+	 *
80
+	 * @since 0.1.0
81
+	 *
82
+	 * @param ConfigInterface   $config       Optional. Configuration settings.
83
+	 * @param ViewFinder|null   $viewFinder   Optional. ViewFinder instance.
84
+	 * @param EngineFinder|null $engineFinder Optional. EngineFinder instance.
85
+	 *
86
+	 * @throws FailedToProcessConfigException If the config could not be processed.
87
+	 */
88
+	public function __construct(
89
+		ConfigInterface $config = null,
90
+		ViewFinder $viewFinder = null,
91
+		EngineFinder $engineFinder = null
92
+	) {
93
+		$this->processConfig($this->getConfig($config));
94
+		$this->viewFinder   = $viewFinder ?? $this->getViewFinder();
95
+		$this->engineFinder = $engineFinder ?? $this->getEngineFinder();
96
+		$this->locations    = new Locations();
97
+	}
98
+
99
+	/**
100
+	 * Create a new view for a given URI.
101
+	 *
102
+	 * @since 0.1.0
103
+	 *
104
+	 * @param string $view View identifier to create a view for.
105
+	 * @param mixed  $type Type of view to create.
106
+	 *
107
+	 * @return View Instance of the requested view.
108
+	 * @throws FailedToInstantiateView If the view could not be instantiated.
109
+	 */
110
+	public function create(string $view, $type = null): View
111
+	{
112
+		if (!array_key_exists($view, $this->viewPathCache)) {
113
+			$uri    = $this->scanLocations([$view]);
114
+			$engine = $uri ? $this->getEngine($uri) : false;
115
+
116
+			$this->viewPathCache[$view]           = [];
117
+			$this->viewPathCache[$view]['uri']    = $uri;
118
+			$this->viewPathCache[$view]['engine'] = $engine;
119
+
120
+			if ($type===null) {
121
+				$this->viewPathCache[$view]['view'] = $uri
122
+					? $this->getView($uri, $engine)
123
+					: false;
124
+			}
125
+		} else {
126
+			$uri    = $this->viewPathCache[$view]['uri'];
127
+			$engine = $this->viewPathCache[$view]['engine'];
128
+		}
129
+
130
+
131
+		if (!$uri || !$engine) {
132
+			return $this->getViewFinder()->getNullObject();
133
+		}
134
+
135
+		if ($type === null) {
136
+			return $this->viewPathCache[$view]['view'];
137
+		}
138
+
139
+		return $this->getView($uri, $engine, $type);
140
+	}
141
+
142
+	/**
143
+	 * Get an Engine that can deal with the given URI.
144
+	 *
145
+	 * @since 0.1.0
146
+	 *
147
+	 * @param string $uri URI to get an engine for.
148
+	 *
149
+	 * @return Engine Instance of an engine that can deal with the given URI.
150
+	 */
151
+	public function getEngine(string $uri): Engine
152
+	{
153
+		return $this->getEngineFinder()->find([$uri]);
154
+	}
155
+
156
+	/**
157
+	 * Get a view for a given URI, engine and type.
158
+	 *
159
+	 * @since 0.1.0
160
+	 *
161
+	 * @param string $uri    URI to get a view for.
162
+	 * @param Engine $engine Engine to use for the view.
163
+	 * @param mixed  $type   Type of view to get.
164
+	 *
165
+	 * @return View View that matches the given requirements.
166
+	 * @throws FailedToInstantiateView If the view could not be instantiated.
167
+	 */
168
+	public function getView(string $uri, Engine $engine, $type = null): View
169
+	{
170
+		if (null === $type) {
171
+			$view = $this->getViewFinder()->find([$uri], $engine);
172
+			return $view->setBuilder( $this );
173
+		}
174
+
175
+		return $this->resolveType($type, $uri, $engine);
176
+	}
177
+
178
+	/**
179
+	 * Get the ViewFinder instance.
180
+	 *
181
+	 * @since 0.1.0
182
+	 *
183
+	 * @return ViewFinder Instance of a BaseViewFinder.
184
+	 */
185
+	public function getViewFinder(): ViewFinder
186
+	{
187
+		return $this->viewFinder ?? $this->getFinder(static::VIEW_FINDER_KEY);
188
+	}
189
+
190
+	/**
191
+	 * Get the EngineFinder instance.
192
+	 *
193
+	 * @since 0.1.0
194
+	 *
195
+	 * @return EngineFinder Instance of a BaseEngineFinder.
196
+	 */
197
+	public function getEngineFinder(): EngineFinder
198
+	{
199
+		return $this->engineFinder ?? $this->getFinder(static::ENGINE_FINDER_KEY);
200
+	}
201
+
202
+	/**
203
+	 * Add a location to scan with the BaseViewFinder.
204
+	 *
205
+	 * @since 0.1.0
206
+	 *
207
+	 * @param Location $location Location to scan with the BaseViewFinder.
208
+	 *
209
+	 * @return static
210
+	 */
211
+	public function addLocation(Location $location)
212
+	{
213
+		$this->locations->add($location);
214
+
215
+		unset( $this->viewPathCache );
216
+		$this->viewPathCache = [];
217
+
218
+		return $this;
219
+	}
220
+
221
+	/**
222
+	 * Get the collection of locations registered with this ViewBuilder.
223
+	 *
224
+	 * @since 0.1.3
225
+	 *
226
+	 * @return Locations Collection of locations.
227
+	 */
228
+	public function getLocations()
229
+	{
230
+		return $this->locations;
231
+	}
232
+
233
+	/**
234
+	 * Scan Locations for an URI that matches the specified criteria.
235
+	 *
236
+	 * @since 0.1.0
237
+	 *
238
+	 * @param array $criteria Criteria to match.
239
+	 *
240
+	 * @return string|false URI of the requested view, or false if not found.
241
+	 */
242
+	public function scanLocations(array $criteria)
243
+	{
244
+		$uris = $this->locations->map(function ($location) use ($criteria) {
245
+			/** @var Location $location */
246
+			return $location->getURI($criteria);
247
+		})->filter(function ($uri) {
248
+			return false !== $uri;
249
+		});
250 250
         
251
-        // Fall back for absolute paths on current filesystem.
252
-        if ($uris->isEmpty()) {
253
-            foreach ($criteria as $criterion) {
254
-                if (file_exists($criterion)) {
255
-                    return $criterion;
256
-                }
257
-            }
258
-        }
259
-
260
-        return $uris->isEmpty() ? false : $uris->first();
261
-    }
262
-
263
-    /**
264
-     * Get a finder instance.
265
-     *
266
-     * @since 0.1.1
267
-     *
268
-     * @param string $key Configuration key to use.
269
-     *
270
-     * @return ViewFinder|EngineFinder The requested finder instance.
271
-     */
272
-    protected function getFinder($key)
273
-    {
274
-        $finderClass = $this->config->getKey($key, 'ClassName');
275
-        return new $finderClass($this->config->getSubConfig($key));
276
-    }
277
-
278
-    /**
279
-     * Resolve the view type.
280
-     *
281
-     * @since 0.1.0
282
-     *
283
-     * @param mixed       $type   Type of view that was requested.
284
-     * @param string      $uri    URI to get a view for.
285
-     * @param Engine|null $engine Engine to use for the view.
286
-     *
287
-     * @return View Resolved View object.
288
-     * @throws FailedToInstantiateView If the view type could not be resolved.
289
-     */
290
-    protected function resolveType($type, string $uri, Engine $engine = null): View
291
-    {
292
-        $configKey = [static::VIEW_FINDER_KEY, 'Views', $type];
293
-
294
-        if (is_string($type) && $this->config->hasKey($configKey)) {
295
-            $className = $this->config->getKey($configKey);
296
-            $type      = new $className($uri, $engine, $this);
297
-        }
298
-
299
-        if (is_string($type)) {
300
-            $type = new $type($uri, $engine, $this);
301
-        }
302
-
303
-        if (is_callable($type)) {
304
-            $type = $type($uri, $engine, $this);
305
-        }
306
-
307
-        if (! $type instanceof View) {
308
-            throw new FailedToInstantiateView(
309
-                sprintf(
310
-                    _('Could not instantiate view "%s".'),
311
-                    serialize($type)
312
-                )
313
-            );
314
-        }
315
-
316
-        return $type;
317
-    }
318
-
319
-    /**
320
-     * Get the configuration to use in the ViewBuilder.
321
-     *
322
-     * @since 0.2.0
323
-     *
324
-     * @param ConfigInterface|array $config Config to merge with defaults.
325
-     *
326
-     * @return ConfigInterface Configuration passed in through the constructor.
327
-     */
328
-    protected function getConfig($config = []): ConfigInterface
329
-    {
330
-        $defaults = ConfigFactory::create(dirname(__DIR__, 2) . '/config/defaults.php', $config);
331
-        $config   = $config
332
-            ? ConfigFactory::createFromArray(array_merge_recursive($defaults->getArrayCopy(), $config->getArrayCopy()))
333
-            : $defaults;
334
-
335
-        return $config->getSubConfig('BrightNucleus\View');
336
-    }
251
+		// Fall back for absolute paths on current filesystem.
252
+		if ($uris->isEmpty()) {
253
+			foreach ($criteria as $criterion) {
254
+				if (file_exists($criterion)) {
255
+					return $criterion;
256
+				}
257
+			}
258
+		}
259
+
260
+		return $uris->isEmpty() ? false : $uris->first();
261
+	}
262
+
263
+	/**
264
+	 * Get a finder instance.
265
+	 *
266
+	 * @since 0.1.1
267
+	 *
268
+	 * @param string $key Configuration key to use.
269
+	 *
270
+	 * @return ViewFinder|EngineFinder The requested finder instance.
271
+	 */
272
+	protected function getFinder($key)
273
+	{
274
+		$finderClass = $this->config->getKey($key, 'ClassName');
275
+		return new $finderClass($this->config->getSubConfig($key));
276
+	}
277
+
278
+	/**
279
+	 * Resolve the view type.
280
+	 *
281
+	 * @since 0.1.0
282
+	 *
283
+	 * @param mixed       $type   Type of view that was requested.
284
+	 * @param string      $uri    URI to get a view for.
285
+	 * @param Engine|null $engine Engine to use for the view.
286
+	 *
287
+	 * @return View Resolved View object.
288
+	 * @throws FailedToInstantiateView If the view type could not be resolved.
289
+	 */
290
+	protected function resolveType($type, string $uri, Engine $engine = null): View
291
+	{
292
+		$configKey = [static::VIEW_FINDER_KEY, 'Views', $type];
293
+
294
+		if (is_string($type) && $this->config->hasKey($configKey)) {
295
+			$className = $this->config->getKey($configKey);
296
+			$type      = new $className($uri, $engine, $this);
297
+		}
298
+
299
+		if (is_string($type)) {
300
+			$type = new $type($uri, $engine, $this);
301
+		}
302
+
303
+		if (is_callable($type)) {
304
+			$type = $type($uri, $engine, $this);
305
+		}
306
+
307
+		if (! $type instanceof View) {
308
+			throw new FailedToInstantiateView(
309
+				sprintf(
310
+					_('Could not instantiate view "%s".'),
311
+					serialize($type)
312
+				)
313
+			);
314
+		}
315
+
316
+		return $type;
317
+	}
318
+
319
+	/**
320
+	 * Get the configuration to use in the ViewBuilder.
321
+	 *
322
+	 * @since 0.2.0
323
+	 *
324
+	 * @param ConfigInterface|array $config Config to merge with defaults.
325
+	 *
326
+	 * @return ConfigInterface Configuration passed in through the constructor.
327
+	 */
328
+	protected function getConfig($config = []): ConfigInterface
329
+	{
330
+		$defaults = ConfigFactory::create(dirname(__DIR__, 2) . '/config/defaults.php', $config);
331
+		$config   = $config
332
+			? ConfigFactory::createFromArray(array_merge_recursive($defaults->getArrayCopy(), $config->getArrayCopy()))
333
+			: $defaults;
334
+
335
+		return $config->getSubConfig('BrightNucleus\View');
336
+	}
337 337
 }
Please login to merge, or discard this patch.
src/View/Location/FilesystemLocation.php 1 patch
Indentation   +181 added lines, -181 removed lines patch added patch discarded remove patch
@@ -28,185 +28,185 @@
 block discarded – undo
28 28
 class FilesystemLocation implements Location
29 29
 {
30 30
 
31
-    /**
32
-     * Path that this location points to.
33
-     *
34
-     * @since 0.1.0
35
-     *
36
-     * @var string
37
-     */
38
-    protected $path;
39
-
40
-    /**
41
-     * Extensions that this location can accept.
42
-     *
43
-     * @since 0.1.0
44
-     *
45
-     * @var Extensions
46
-     */
47
-    protected $extensions;
48
-
49
-    /**
50
-     * Instantiate a FilesystemLocation object.
51
-     *
52
-     * @since 0.1.0
53
-     *
54
-     * @param string                       $path       Path that this location points to.
55
-     * @param Extensions|array|string|null $extensions Optional. Extensions that this location can accept.
56
-     */
57
-    public function __construct(string $path, $extensions = null)
58
-    {
59
-        $this->path       = $path;
60
-        $this->extensions = $this->validateExtensions($extensions);
61
-    }
62
-
63
-    /**
64
-     * Get the first URI that matches the given criteria.
65
-     *
66
-     * @since 0.1.0
67
-     *
68
-     * @param array $criteria Criteria to match.
69
-     *
70
-     * @return string|false URI that matches the criteria or false if none found.
71
-     */
72
-    public function getURI(array $criteria)
73
-    {
74
-        $uris = $this->getURIs($criteria);
75
-
76
-        return $uris->count() > 0
77
-            ? $uris->first()
78
-            : false;
79
-    }
80
-
81
-    /**
82
-     * Get all URIs that match the given criteria.
83
-     *
84
-     * @since 0.1.1
85
-     *
86
-     * @param array $criteria Criteria to match.
87
-     *
88
-     * @return URIs URIs that match the criteria or an empty collection if none found.
89
-     */
90
-    public function getURIs(array $criteria): URIs
91
-    {
92
-        $uris = new URIs();
93
-
94
-        foreach ($this->extensions as $extension) {
95
-            $finder = new Finder();
96
-
97
-            try {
98
-            	bdump( $this->getPathPattern($this->getRelativePath($criteria)) );
99
-                $finder->files()
100
-                    ->name($this->getNamePattern($criteria, $extension))
101
-                    ->in($this->getPathPattern($this->getRelativePath($criteria)));
102
-                foreach ($finder as $file) {
103
-                    /** @var SplFileInfo $file */
104
-                    $uris->add($file->getPathname());
105
-                }
106
-            } catch (Exception $exception) {
107
-                // Fail silently;
108
-            }
109
-        }
110
-
111
-        return $uris;
112
-    }
113
-
114
-    /**
115
-     * Get the name pattern to pass to the file finder.
116
-     *
117
-     * @since 0.1.3
118
-     *
119
-     * @param array  $criteria  Criteria to match.
120
-     * @param string $extension Extension to match.
121
-     *
122
-     * @return string Name pattern to pass to the file finder.
123
-     */
124
-    protected function getNamePattern(array $criteria, string $extension): string
125
-    {
126
-        $names = [];
127
-
128
-        $names[] = array_map(function ($criterion) use ($extension) {
129
-            $uriExtension = URIHelper::containsExtension($criterion);
130
-            if (! empty($extension)) {
131
-                $extension = ltrim($extension, '.');
132
-
133
-                if ($uriExtension === $extension) {
134
-                    $criterion = substr($criterion,0,-strlen(".{$extension}"));
135
-                }
136
-            } else {
137
-                $extension = URIHelper::containsExtension($criterion);
138
-                if (!empty($extension)) {
139
-                    $criterion = substr($criterion,0,-strlen(".{$extension}"));
140
-                }
141
-            }
142
-
143
-            $criterion = preg_quote(URIHelper::getFilename($criterion), chr(1));
144
-
145
-            return (empty($extension) || URIHelper::hasExtension($criterion, $extension))
146
-                ? "{$criterion}(?:\..*?)$"
147
-                : "{$criterion}\.{$extension}$";
148
-        }, $criteria)[0];
149
-
150
-        return chr(1) . implode('|', array_unique($names)) . chr(1);
151
-    }
152
-
153
-    /**
154
-     * Get the path pattern to pass to the file finder.
155
-     *
156
-     * @since 0.4.7
157
-     *
158
-     * @param string $relativePath Relative path that was included in the
159
-     *                             criterion.
160
-     * @return string Path pattern to pass to the file finder.
161
-     */
162
-    protected function getPathPattern(string $relativePath): string
163
-    {
164
-        if (empty($relativePath)) {
165
-            return $this->path;
166
-        }
167
-
168
-        return rtrim($this->path,'/') . '/' . ltrim($relativePath, '/');
169
-    }
170
-
171
-    /**
172
-     * Get the relative path that is included in the criterion.
173
-     *
174
-     * @since 0.4.7
175
-     *
176
-     * @param array $criteria Criteria to extract the relative path from.
177
-     * @return string Relative path included in the criterion.
178
-     */
179
-    protected function getRelativePath($criteria): string
180
-    {
181
-        $criterion  = current($criteria);
182
-        $components = explode('/', $criterion);
183
-
184
-        if (count($components) < 2) {
185
-            return '';
186
-        }
187
-
188
-        return implode('/', array_slice($components, 0, -1));
189
-    }
190
-
191
-    /**
192
-     * Validate the extensions and return a collection.
193
-     *
194
-     * @since 0.1.1
195
-     *
196
-     * @param Extensions|array|string|null $extensions Extensions to validate.
197
-     *
198
-     * @return Extensions Validated extensions collection.
199
-     */
200
-    protected function validateExtensions($extensions): Extensions
201
-    {
202
-        if (empty($extensions)) {
203
-            $extensions = new Extensions(['']);
204
-        }
205
-
206
-        if (! $extensions instanceof Extensions) {
207
-            $extensions = new Extensions((array)$extensions);
208
-        }
209
-
210
-        return $extensions;
211
-    }
31
+	/**
32
+	 * Path that this location points to.
33
+	 *
34
+	 * @since 0.1.0
35
+	 *
36
+	 * @var string
37
+	 */
38
+	protected $path;
39
+
40
+	/**
41
+	 * Extensions that this location can accept.
42
+	 *
43
+	 * @since 0.1.0
44
+	 *
45
+	 * @var Extensions
46
+	 */
47
+	protected $extensions;
48
+
49
+	/**
50
+	 * Instantiate a FilesystemLocation object.
51
+	 *
52
+	 * @since 0.1.0
53
+	 *
54
+	 * @param string                       $path       Path that this location points to.
55
+	 * @param Extensions|array|string|null $extensions Optional. Extensions that this location can accept.
56
+	 */
57
+	public function __construct(string $path, $extensions = null)
58
+	{
59
+		$this->path       = $path;
60
+		$this->extensions = $this->validateExtensions($extensions);
61
+	}
62
+
63
+	/**
64
+	 * Get the first URI that matches the given criteria.
65
+	 *
66
+	 * @since 0.1.0
67
+	 *
68
+	 * @param array $criteria Criteria to match.
69
+	 *
70
+	 * @return string|false URI that matches the criteria or false if none found.
71
+	 */
72
+	public function getURI(array $criteria)
73
+	{
74
+		$uris = $this->getURIs($criteria);
75
+
76
+		return $uris->count() > 0
77
+			? $uris->first()
78
+			: false;
79
+	}
80
+
81
+	/**
82
+	 * Get all URIs that match the given criteria.
83
+	 *
84
+	 * @since 0.1.1
85
+	 *
86
+	 * @param array $criteria Criteria to match.
87
+	 *
88
+	 * @return URIs URIs that match the criteria or an empty collection if none found.
89
+	 */
90
+	public function getURIs(array $criteria): URIs
91
+	{
92
+		$uris = new URIs();
93
+
94
+		foreach ($this->extensions as $extension) {
95
+			$finder = new Finder();
96
+
97
+			try {
98
+				bdump( $this->getPathPattern($this->getRelativePath($criteria)) );
99
+				$finder->files()
100
+					->name($this->getNamePattern($criteria, $extension))
101
+					->in($this->getPathPattern($this->getRelativePath($criteria)));
102
+				foreach ($finder as $file) {
103
+					/** @var SplFileInfo $file */
104
+					$uris->add($file->getPathname());
105
+				}
106
+			} catch (Exception $exception) {
107
+				// Fail silently;
108
+			}
109
+		}
110
+
111
+		return $uris;
112
+	}
113
+
114
+	/**
115
+	 * Get the name pattern to pass to the file finder.
116
+	 *
117
+	 * @since 0.1.3
118
+	 *
119
+	 * @param array  $criteria  Criteria to match.
120
+	 * @param string $extension Extension to match.
121
+	 *
122
+	 * @return string Name pattern to pass to the file finder.
123
+	 */
124
+	protected function getNamePattern(array $criteria, string $extension): string
125
+	{
126
+		$names = [];
127
+
128
+		$names[] = array_map(function ($criterion) use ($extension) {
129
+			$uriExtension = URIHelper::containsExtension($criterion);
130
+			if (! empty($extension)) {
131
+				$extension = ltrim($extension, '.');
132
+
133
+				if ($uriExtension === $extension) {
134
+					$criterion = substr($criterion,0,-strlen(".{$extension}"));
135
+				}
136
+			} else {
137
+				$extension = URIHelper::containsExtension($criterion);
138
+				if (!empty($extension)) {
139
+					$criterion = substr($criterion,0,-strlen(".{$extension}"));
140
+				}
141
+			}
142
+
143
+			$criterion = preg_quote(URIHelper::getFilename($criterion), chr(1));
144
+
145
+			return (empty($extension) || URIHelper::hasExtension($criterion, $extension))
146
+				? "{$criterion}(?:\..*?)$"
147
+				: "{$criterion}\.{$extension}$";
148
+		}, $criteria)[0];
149
+
150
+		return chr(1) . implode('|', array_unique($names)) . chr(1);
151
+	}
152
+
153
+	/**
154
+	 * Get the path pattern to pass to the file finder.
155
+	 *
156
+	 * @since 0.4.7
157
+	 *
158
+	 * @param string $relativePath Relative path that was included in the
159
+	 *                             criterion.
160
+	 * @return string Path pattern to pass to the file finder.
161
+	 */
162
+	protected function getPathPattern(string $relativePath): string
163
+	{
164
+		if (empty($relativePath)) {
165
+			return $this->path;
166
+		}
167
+
168
+		return rtrim($this->path,'/') . '/' . ltrim($relativePath, '/');
169
+	}
170
+
171
+	/**
172
+	 * Get the relative path that is included in the criterion.
173
+	 *
174
+	 * @since 0.4.7
175
+	 *
176
+	 * @param array $criteria Criteria to extract the relative path from.
177
+	 * @return string Relative path included in the criterion.
178
+	 */
179
+	protected function getRelativePath($criteria): string
180
+	{
181
+		$criterion  = current($criteria);
182
+		$components = explode('/', $criterion);
183
+
184
+		if (count($components) < 2) {
185
+			return '';
186
+		}
187
+
188
+		return implode('/', array_slice($components, 0, -1));
189
+	}
190
+
191
+	/**
192
+	 * Validate the extensions and return a collection.
193
+	 *
194
+	 * @since 0.1.1
195
+	 *
196
+	 * @param Extensions|array|string|null $extensions Extensions to validate.
197
+	 *
198
+	 * @return Extensions Validated extensions collection.
199
+	 */
200
+	protected function validateExtensions($extensions): Extensions
201
+	{
202
+		if (empty($extensions)) {
203
+			$extensions = new Extensions(['']);
204
+		}
205
+
206
+		if (! $extensions instanceof Extensions) {
207
+			$extensions = new Extensions((array)$extensions);
208
+		}
209
+
210
+		return $extensions;
211
+	}
212 212
 }
Please login to merge, or discard this patch.