Skip to content

Commit dde1eff

Browse files
committed
Introduce route() method that returns the ResourceMetadata that matches the given Request object.
Works exactly like getResource() but does not instantiate the Resource object, allowing for creater flexibility with Resource class loading and object creation.
1 parent a074a57 commit dde1eff

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

spec/Tonic/ApplicationSpec.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,21 @@ function it_should_be_initializable()
4444
$this->shouldHaveType('Tonic\Application');
4545
}
4646

47+
/**
48+
* @param \Tonic\Request $request
49+
*/
50+
function it_should_route_a_request($request)
51+
{
52+
$request->getUri()->willReturn('/foo/bar');
53+
$request->getParams()->willReturn(null);
54+
$request->setParams(array())->willReturn(null);
55+
56+
$route = $this->route($request);
57+
58+
$route->shouldHaveType('Tonic\ResourceMetadata');
59+
$route->getClass()->shouldBe('\spec\Tonic\ExampleResource');
60+
}
61+
4762
/**
4863
* @param \Tonic\Request $request
4964
*/

src/Tonic/Application.php

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,39 @@ public function uri($className, $params = array())
150150
* Given the request data and the loaded resource metadata, pick the best matching
151151
* resource to handle the request based on URI and priority.
152152
*
153+
* @deprecated You should use the route method instead.
153154
* @param Request $request
154155
* @return Resource
155156
*/
156157
public function getResource($request = NULL)
158+
{
159+
if (!$request) {
160+
$request = new Request();
161+
}
162+
163+
$route = $this->route($request);
164+
$filename = $route->getFilename();
165+
$className = $route->getClass();
166+
167+
if ($filename && is_readable($filename)) {
168+
require_once($filename);
169+
}
170+
171+
return new $className($this, $request);
172+
}
173+
174+
/**
175+
* Given the request data and the loaded resource metadata, pick the best matching
176+
* resource to handle the request based on URI and priority.
177+
*
178+
* @param Request $request
179+
* @return ResourceMetadata
180+
*/
181+
public function route($request = NULL)
157182
{
158183
$matchedResource = NULL;
159184
if (!$request) {
160-
$request= new Request();
185+
$request = new Request();
161186
}
162187
foreach ($this->resources as $className => $resourceMetadata) {
163188
foreach ($resourceMetadata->getUri() as $index => $uri) {
@@ -179,13 +204,9 @@ public function getResource($request = NULL)
179204
}
180205
}
181206
if ($matchedResource) {
182-
if ($matchedResource[0]->getFilename() && is_readable($matchedResource[0]->getFilename())) {
183-
require_once($matchedResource[0]->getFilename());
184-
}
185207
$request->setParams($matchedResource[1]);
186208

187-
$className = $matchedResource[0]->getClass();
188-
return new $className($this, $request, $matchedResource[1]);
209+
return $matchedResource[0];
189210
} else {
190211
throw new NotFoundException(sprintf('Resource matching URI "%s" not found', $request->uri));
191212
}
@@ -194,7 +215,7 @@ public function getResource($request = NULL)
194215
/**
195216
* Get the already loaded resource annotation metadata
196217
* @param Tonic/Resource $resource
197-
* @return str[]
218+
* @return ResourceMetadata
198219
*/
199220
public function getResourceMetadata($resource)
200221
{

0 commit comments

Comments
 (0)