/** * Process the method * @param $resource * @param Mapping\ClassMetaData $metadata * @throws DrestException */ protected function processMethods($resource, Mapping\ClassMetaData $metadata) { /* @var \ReflectionMethod $method */ foreach ($resource['routes'] as $route) { // Make sure the for is not empty if (!isset($route['name']) || !is_string($route['name'])) { throw DrestException::handleForCannotBeEmpty(); } if (($routeMetaData = $metadata->getRouteMetaData($route['name'])) === false) { throw DrestException::handleAnnotationDoesntMatchRouteName($route['name']); } if ($routeMetaData->hasHandleCall()) { // There is already a handle set for this route throw DrestException::handleAlreadyDefinedForRoute($routeMetaData); } // Set the handle if (isset($route['handle_call'])) { $routeMetaData->setHandleCall($route['handle_call']); } } }
/** * Process the method * @param $methods * @param Mapping\ClassMetaData $metadata * @throws DrestException */ protected function processMethods($methods, Mapping\ClassMetaData $metadata) { // Set the handle calls foreach ($methods as $method) { /* @var \ReflectionMethod $method */ if ($method->isPublic()) { foreach ($this->reader->getMethodAnnotations($method) as $methodAnnotation) { if ($methodAnnotation instanceof Annotation\Handle) { // Make sure the for is not empty if (empty($methodAnnotation->for) || !is_string($methodAnnotation->for)) { throw DrestException::handleForCannotBeEmpty(); } if (($routeMetaData = $metadata->getRouteMetaData($methodAnnotation->for)) === false) { throw DrestException::handleAnnotationDoesntMatchRouteName($methodAnnotation->for); } if ($routeMetaData->hasHandleCall()) { // There is already a handle set for this route throw DrestException::handleAlreadyDefinedForRoute($routeMetaData); } $routeMetaData->setHandleCall($method->getName()); } } } } }
/** * Load metadata for a class name * @param object|string $class - Pass in either the class name, or an instance of that class * @return Mapping\ClassMetaData $metaData - return null if metadata couldn't be populated from annotations * @throws DrestException */ public function loadMetadataForClass($class) { $resourceFound = false; if (is_string($class)) { $class = new \ReflectionClass($class); } $metadata = new Mapping\ClassMetaData($class); foreach ($this->reader->getClassAnnotations($class) as $annotatedObject) { if ($annotatedObject instanceof Annotation\Resource) { $resourceFound = true; $originFound = false; if ($annotatedObject->routes === null) { throw DrestException::annotatedResourceRequiresAtLeastOneServiceDefinition($class->name); } $metadata->addRepresentations($annotatedObject->representations); foreach ($annotatedObject->routes as $route) { $routeMetaData = new Mapping\RouteMetaData(); // Set name $route->name = preg_replace("/[^a-zA-Z0-9_\\s]/", "", $route->name); if ($route->name == '') { throw DrestException::routeNameIsEmpty(); } if ($metadata->getRoutesMetaData($route->name) !== false) { throw DrestException::routeAlreadyDefinedWithName($class->name, $route->name); } $routeMetaData->setName($route->name); // Set verbs (will throw if invalid) if (isset($route->verbs)) { $routeMetaData->setVerbs($route->verbs); } if (isset($route->collection)) { $routeMetaData->setCollection($route->collection); } // Add the route pattern $routeMetaData->setRoutePattern($route->routePattern); if (is_array($route->routeConditions)) { $routeMetaData->setRouteConditions($route->routeConditions); } // Set the exposure array if (is_array($route->expose)) { $routeMetaData->setExpose($route->expose); } // Set the allow options value if (isset($route->allowOptions)) { $routeMetaData->setAllowedOptionRequest($route->allowOptions); } // Add action class if (isset($route->action)) { $routeMetaData->setActionClass($route->action); } // If the origin flag is set, set the name on the class meta data if (!is_null($route->origin)) { if ($originFound) { throw DrestException::resourceCanOnlyHaveOneRouteSetAsOrigin(); } $metadata->originRouteName = $route->name; $originFound = true; } $metadata->addRouteMetaData($routeMetaData); } // Set the handle calls foreach ($class->getMethods() as $method) { /* @var \ReflectionMethod $method */ if ($method->isPublic()) { foreach ($this->reader->getMethodAnnotations($method) as $methodAnnotation) { if ($methodAnnotation instanceof Annotation\Handle) { // Make sure the for is not empty if (empty($methodAnnotation->for) || !is_string($methodAnnotation->for)) { throw DrestException::handleForCannotBeEmpty(); } if (($routeMetaData = $metadata->getRoutesMetaData($methodAnnotation->for)) === false) { throw DrestException::handleAnnotationDoesntMatchRouteName($methodAnnotation->for); } if ($routeMetaData->hasHandleCall()) { // There is already a handle set for this route throw DrestException::alreadyHandleDefinedForRoute($routeMetaData); } $routeMetaData->setHandleCall($method->getName()); $routeMetaData->setInjectRequestIntoHandle($methodAnnotation->injectRequest); } } } } // Error for any push metadata routes that don't have a handle foreach ($metadata->getRoutesMetaData() as $routeMetaData) { /* @var RouteMetaData $routeMetaData */ if ($routeMetaData->needsHandleCall() && !$routeMetaData->hasHandleCall()) { throw DrestException::routeRequiresHandle($routeMetaData->getName()); } } } } return $resourceFound ? $metadata : null; }