/** * @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))); }
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); } }
private function parseExtension(Path $target) { $extension = null; $elements = $target->getElements(); if (count($elements) && strpos($elements[count($elements) - 1], '.')) { $parts = explode('.', array_pop($elements)); $extension = array_pop($parts); $elements[] = implode('.', $parts); } return array(new Path($elements), $extension); }