/**
  * Render a list group of Content-Type headers composed by the service
  *
  * @param  Service $service
  * @return string
  */
 public function __invoke(Service $service)
 {
     $view = $this->getView();
     $types = array_map(function ($type) use($view) {
         return sprintf('<div class="list-group-item">%s</div>', $view->escapeHtml($type));
     }, $service->getRequestContentTypes());
     return implode("\n", $types);
 }
 /**
  * Return the URI path for a given service and operation
  *
  * @param  Service $service
  * @param  Operation $operation
  * @return string
  */
 public function __invoke(Service $service)
 {
     $route = $service->getRoute();
     $routeIdentifier = $service->getRouteIdentifierName();
     if (empty($routeIdentifier)) {
         return $route;
     }
     return preg_replace('#\\[/?:' . preg_quote($routeIdentifier) . '\\]#', '', $route);
 }
 /**
  * Return the URI path for a given service and operation
  *
  * @param  Service $service
  * @param  Operation $operation
  * @return string
  */
 public function __invoke(Service $service, Operation $operation)
 {
     $route = $service->getRoute();
     $routeIdentifier = $service->getRouteIdentifierName();
     $entityOps = $service->getEntityOperations();
     if (empty($routeIdentifier) || empty($entityOps)) {
         return $route;
     }
     return preg_replace('#\\[/?:' . preg_quote($routeIdentifier) . '\\]#', '', $route);
 }
 /**
  * Create resources from service.
  *
  * If service has a route identifier, creates both entity and collection
  * resources; otherwise, creates an RPC resource.
  *
  * @return void
  */
 private function createResources()
 {
     // If there is routeIdentifierName, it is REST service and we need to
     // handle both collection and entities
     if ($this->service->getRouteIdentifierName()) {
         $this->resources[] = new Resource($this->service, $this->service->getOperations(), $this->getCollectionUri(), Resource::RESOURCE_TYPE_COLLECTION);
         $this->resources[] = new Resource($this->service, $this->service->getEntityOperations(), $this->getEntityUri(), Resource::RESOURCE_TYPE_ENTITY);
         return;
     }
     $this->resources[] = new Resource($this->service, $this->service->getOperations(), $this->getEntityUri(), Resource::RESOURCE_TYPE_RPC);
 }
 /**
  * Create documentation details for a given service in a given version of
  * an API module
  *
  * @param Api $api
  * @param string $serviceName
  * @return Service
  */
 public function createService(Api $api, $serviceName)
 {
     $service = new Service();
     $service->setApi($api);
     $serviceData = null;
     $isRest = false;
     $isRpc = false;
     $hasSegments = false;
     $hasFields = false;
     foreach ($this->config['zf-rest'] as $serviceClassName => $restConfig) {
         if (strpos($serviceClassName, $api->getName() . '\\') === 0 && isset($restConfig['service_name']) && $restConfig['service_name'] === $serviceName && strstr($serviceClassName, '\\V' . $api->getVersion() . '\\') !== false) {
             $serviceData = $restConfig;
             $isRest = true;
             $hasSegments = true;
             break;
         }
     }
     if (!$serviceData) {
         foreach ($this->config['zf-rpc'] as $serviceClassName => $rpcConfig) {
             if (strpos($serviceClassName, $api->getName() . '\\') === 0 && isset($rpcConfig['service_name']) && $rpcConfig['service_name'] === $serviceName && strstr($serviceClassName, '\\V' . $api->getVersion() . '\\') !== false) {
                 $serviceData = $rpcConfig;
                 $serviceData['action'] = $this->marshalActionFromRouteConfig($serviceName, $serviceClassName, $rpcConfig);
                 $isRpc = true;
                 break;
             }
         }
     }
     if (!$serviceData || !isset($serviceClassName)) {
         return false;
     }
     $authorizations = $this->getAuthorizations($serviceClassName);
     $docsArray = $this->getDocumentationConfig($api->getName());
     $service->setName($serviceData['service_name']);
     if (isset($docsArray[$serviceClassName]['description'])) {
         $service->setDescription($docsArray[$serviceClassName]['description']);
     }
     $route = $this->config['router']['routes'][$serviceData['route_name']]['options']['route'];
     $service->setRoute(str_replace('[/v:version]', '', $route));
     // remove internal version prefix, hacky
     if ($isRpc) {
         $hasSegments = $this->hasOptionalSegments($route);
     }
     if (isset($serviceData['route_identifier_name'])) {
         $service->setRouteIdentifierName($serviceData['route_identifier_name']);
     }
     $fields = [];
     if (isset($this->config['zf-content-validation'][$serviceClassName])) {
         foreach ($this->config['zf-content-validation'][$serviceClassName] as $validatorKey => $validatorName) {
             if (isset($this->config['input_filter_specs'][$validatorName])) {
                 foreach ($this->mapFields($this->config['input_filter_specs'][$validatorName]) as $fieldData) {
                     $fields[$validatorKey][] = $this->getField($fieldData);
                 }
                 $hasFields = true;
             }
         }
     }
     $baseOperationData = isset($serviceData['collection_http_methods']) ? $serviceData['collection_http_methods'] : $serviceData['http_methods'];
     $ops = [];
     foreach ($baseOperationData as $httpMethod) {
         $op = new Operation();
         $op->setHttpMethod($httpMethod);
         if ($isRest) {
             $description = isset($docsArray[$serviceClassName]['collection'][$httpMethod]['description']) ? $docsArray[$serviceClassName]['collection'][$httpMethod]['description'] : '';
             $op->setDescription($description);
             $requestDescription = isset($docsArray[$serviceClassName]['collection'][$httpMethod]['request']) ? $docsArray[$serviceClassName]['collection'][$httpMethod]['request'] : '';
             $op->setRequestDescription($requestDescription);
             $responseDescription = isset($docsArray[$serviceClassName]['collection'][$httpMethod]['response']) ? $docsArray[$serviceClassName]['collection'][$httpMethod]['response'] : '';
             $op->setResponseDescription($responseDescription);
             $op->setRequiresAuthorization(isset($authorizations['collection'][$httpMethod]) ? $authorizations['collection'][$httpMethod] : false);
             $op->setResponseStatusCodes($this->getStatusCodes($httpMethod, false, $hasFields, $op->requiresAuthorization()));
         }
         if ($isRpc) {
             $description = isset($docsArray[$serviceClassName][$httpMethod]['description']) ? $docsArray[$serviceClassName][$httpMethod]['description'] : '';
             $op->setDescription($description);
             $requestDescription = isset($docsArray[$serviceClassName][$httpMethod]['request']) ? $docsArray[$serviceClassName][$httpMethod]['request'] : '';
             $op->setRequestDescription($requestDescription);
             $responseDescription = isset($docsArray[$serviceClassName][$httpMethod]['response']) ? $docsArray[$serviceClassName][$httpMethod]['response'] : '';
             $op->setResponseDescription($responseDescription);
             $op->setRequiresAuthorization(isset($authorizations['actions'][$serviceData['action']][$httpMethod]) ? $authorizations['actions'][$serviceData['action']][$httpMethod] : false);
             $op->setResponseStatusCodes($this->getStatusCodes($httpMethod, $hasSegments, $hasFields, $op->requiresAuthorization()));
         }
         $ops[] = $op;
     }
     $service->setFields($fields);
     $service->setOperations($ops);
     if (isset($serviceData['entity_http_methods'])) {
         $ops = [];
         foreach ($serviceData['entity_http_methods'] as $httpMethod) {
             $op = new Operation();
             $op->setHttpMethod($httpMethod);
             $description = isset($docsArray[$serviceClassName]['entity'][$httpMethod]['description']) ? $docsArray[$serviceClassName]['entity'][$httpMethod]['description'] : '';
             $op->setDescription($description);
             $requestDescription = isset($docsArray[$serviceClassName]['entity'][$httpMethod]['request']) ? $docsArray[$serviceClassName]['entity'][$httpMethod]['request'] : '';
             $op->setRequestDescription($requestDescription);
             $responseDescription = isset($docsArray[$serviceClassName]['entity'][$httpMethod]['response']) ? $docsArray[$serviceClassName]['entity'][$httpMethod]['response'] : '';
             $op->setResponseDescription($responseDescription);
             $op->setRequiresAuthorization(isset($authorizations['entity'][$httpMethod]) ? $authorizations['entity'][$httpMethod] : false);
             $op->setResponseStatusCodes($this->getStatusCodes($httpMethod, true, $hasFields, $op->requiresAuthorization()));
             $ops[] = $op;
         }
         $service->setEntityOperations($ops);
     }
     if (isset($this->config['zf-content-negotiation']['accept_whitelist'][$serviceClassName])) {
         $service->setRequestAcceptTypes($this->config['zf-content-negotiation']['accept_whitelist'][$serviceClassName]);
     }
     if (isset($this->config['zf-content-negotiation']['content_type_whitelist'][$serviceClassName])) {
         $service->setRequestContentTypes($this->config['zf-content-negotiation']['content_type_whitelist'][$serviceClassName]);
     }
     return $service;
 }