/**
  * Inject the class name of the controller, if it can be resolved.
  *
  * @param RpcServiceEntity $service
  */
 protected function injectControllerClass(RpcServiceEntity $service)
 {
     $controllerServiceName = $service->controllerServiceName;
     if (!$this->controllerManager->has($controllerServiceName)) {
         return;
     }
     $controller = $this->controllerManager->get($controllerServiceName);
     $service->exchangeArray(['controller_class' => get_class($controller)]);
 }
 /**
  * @param Model\RestServiceEntity|Model\RpcServiceEntity $entity
  * @param EventInterface $e
  * @return void
  */
 private function injectServiceCollectionRelationalLinks($entity, EventInterface $e)
 {
     $entity->exchangeArray(['controller_service_name' => str_replace('\\', '-', $entity->controllerServiceName)]);
     $module = $this->routeMatch->getParam('name');
     $service = $entity->controllerServiceName;
     $type = $this->getServiceType($service);
     $halEntity = new Entity($entity, $service);
     $links = $halEntity->getLinks();
     // Need to inject the self relational link, as otherwise the HAL plugin
     // sees we have links, and does not inject one.
     $links->add(Link::factory(['rel' => 'self', 'route' => ['name' => sprintf('zf-apigility/api/module/%s-service', $type), 'params' => ['name' => $module, 'controller_service_name' => $service]]]));
     // Add the input_filter relational link
     $links->add(Link::factory(['rel' => 'input_filter', 'route' => ['name' => sprintf('zf-apigility/api/module/%s-service/input-filter', $type), 'params' => ['name' => $module, 'controller_service_name' => $service]]]));
     // Add the documentation relational link
     $links->add(Link::factory(['rel' => 'documentation', 'route' => ['name' => sprintf('zf-apigility/api/module/%s-service/doc', $type), 'params' => ['name' => $module, 'controller_service_name' => $service]]]));
     $e->setParam('entity', $halEntity);
 }
 /**
  * Fetch a single RPC service
  *
  * @todo   get route details?
  * @param  string $controllerServiceName
  * @return RpcServiceEntity|false
  */
 public function fetch($controllerServiceName)
 {
     $data = ['controller_service_name' => $controllerServiceName];
     $config = $this->configResource->fetch(true);
     if (!isset($config['zf-rpc'][$controllerServiceName])) {
         return false;
     }
     $rpcConfig = $config['zf-rpc'][$controllerServiceName];
     if (isset($rpcConfig['route_name'])) {
         $data['route_name'] = $rpcConfig['route_name'];
         $data['route_match'] = $this->getRouteMatchStringFromModuleConfig($data['route_name'], $config);
     }
     if (isset($rpcConfig['http_methods'])) {
         $data['http_methods'] = $rpcConfig['http_methods'];
     }
     if (!empty($rpcConfig['service_name'])) {
         $data['service_name'] = $rpcConfig['service_name'];
     } else {
         $data['service_name'] = $controllerServiceName;
         $pattern = vsprintf('#%sV[^%s]+%sRpc%s(?<service>[^%s]+)%sController#', array_fill(0, 6, preg_quote('\\')));
         if (preg_match($pattern, $controllerServiceName, $matches)) {
             $data['service_name'] = $matches['service'];
         }
     }
     if (isset($config['zf-content-negotiation'])) {
         $contentNegotiationConfig = $config['zf-content-negotiation'];
         if (isset($contentNegotiationConfig['controllers'][$controllerServiceName])) {
             $data['selector'] = $contentNegotiationConfig['controllers'][$controllerServiceName];
         }
         if (isset($contentNegotiationConfig['accept_whitelist'][$controllerServiceName])) {
             $data['accept_whitelist'] = $contentNegotiationConfig['accept_whitelist'][$controllerServiceName];
         }
         if (isset($contentNegotiationConfig['content_type_whitelist'][$controllerServiceName])) {
             $data['content_type_whitelist'] = $contentNegotiationConfig['content_type_whitelist'][$controllerServiceName];
         }
     }
     $service = new RpcServiceEntity();
     $service->exchangeArray($data);
     return $service;
 }
 /**
  * Fetch a single RPC service
  *
  * @todo   get route details?
  * @param  string $controllerServiceName
  * @return RpcServiceEntity|false
  */
 public function fetch($controllerServiceName)
 {
     $data = array('controller_service_name' => $controllerServiceName);
     $config = $this->configResource->fetch(true);
     if (!isset($config['zf-rpc'][$controllerServiceName])) {
         return false;
     }
     $rpcConfig = $config['zf-rpc'][$controllerServiceName];
     if (isset($rpcConfig['route_name'])) {
         $data['route_name'] = $rpcConfig['route_name'];
         $data['route_match'] = $this->getRouteMatchStringFromModuleConfig($data['route_name'], $config);
     }
     if (isset($rpcConfig['http_methods'])) {
         $data['http_methods'] = $rpcConfig['http_methods'];
     }
     if (isset($rpcConfig['service_name']) && !empty($rpcConfig['service_name'])) {
         $data['service_name'] = $rpcConfig['service_name'];
     } else {
         $data['service_name'] = $controllerServiceName;
         $q = preg_quote('\\');
         if (preg_match('#' . $q . 'V[^' . $q . ']+' . $q . 'Rpc' . $q . '(?<service>[^' . $q . ']+)' . $q . 'Controller#', $controllerServiceName, $matches)) {
             $data['service_name'] = $matches['service'];
         }
     }
     if (isset($config['zf-content-negotiation'])) {
         $contentNegotiationConfig = $config['zf-content-negotiation'];
         if (isset($contentNegotiationConfig['controllers']) && isset($contentNegotiationConfig['controllers'][$controllerServiceName])) {
             $data['selector'] = $contentNegotiationConfig['controllers'][$controllerServiceName];
         }
         if (isset($contentNegotiationConfig['accept_whitelist']) && isset($contentNegotiationConfig['accept_whitelist'][$controllerServiceName])) {
             $data['accept_whitelist'] = $contentNegotiationConfig['accept_whitelist'][$controllerServiceName];
         }
         if (isset($contentNegotiationConfig['content_type_whitelist']) && isset($contentNegotiationConfig['content_type_whitelist'][$controllerServiceName])) {
             $data['content_type_whitelist'] = $contentNegotiationConfig['content_type_whitelist'][$controllerServiceName];
         }
     }
     $service = new RpcServiceEntity();
     $service->exchangeArray($data);
     return $service;
 }