/** * @param \watoki\deli\Request $request * @return \watoki\deli\Request|null */ public function matches(Request $request) { if (!$this->path->getElements()) { return $request; } $target = $request->getTarget()->getElements(); $elements = $this->path->getElements(); for ($i = 0; $i < count($elements); $i++) { $p = $elements[$i]; if ($i >= count($target)) { return null; } else { if (substr($p, 0, 1) == '{' && substr($p, -1) == '}') { $key = substr($p, 1, -1); $value = $target[$i]; $request = $request->withArgument($key, $value); } else { if ($target[$i] != $p) { return null; } } } } return $request->withContext($request->getContext()->appendedAll(array_slice($target, 0, $i - 1)))->withTarget(new Path(array_slice($target, $i - 1))); }
public function route(Request $request) { if ($this->default && $request->getTarget()->isEmpty()) { return $this->default->create($request); } try { return parent::route($request); } catch (TargetNotFoundException $e) { if ($request instanceof WebRequest && ($found = $this->findFile($request))) { return $this->createTargetFromFile($request, $found); } throw $e; } }
/** * @param Path|Url $context * @return static */ public function withContext(Path $context) { if (!$context instanceof Url) { $context = $this->getContext()->with($context); } return parent::withContext($context); }
private function createTargetFromClass($fullClassName, Request $request, Path $context) { $object = $this->factory->getInstance($fullClassName); $nextRequest = $request->withContext($request->getContext()->appendedAll($context->getElements())); $nextRequest = $nextRequest->withTarget(new Path(array_slice($request->getTarget()->getElements(), count($context->getElements())))); if ($object instanceof Responding) { return new RespondingTarget($nextRequest, $object); } else { return new ObjectTarget($nextRequest, $object, $this->factory); } }
protected function isContainerTarget(Request $request) { return in_array($request->getTarget()->getElements(), [[], [''], ['index']]); }
private function thenTheRoutedRequestShouldHaveTheContext($string) { $this->assertEquals($string, $this->response->getContext()->toString()); }
public function givenTheRequestHasTheArgument_WithTheValue($key, $value) { $this->request = $this->request->withArgument($key, $value); }