/** * Loop through configuration to discover and set controller options. * * @param array $config * @param RestController $controller */ protected function setControllerOptions(array $config, RestController $controller) { foreach ($config as $option => $value) { switch ($option) { case 'collection_http_methods': $controller->setCollectionHttpMethods($value); break; case 'collection_name': $controller->setCollectionName($value); break; case 'collection_query_whitelist': if (is_string($value)) { $value = (array) $value; } if (!is_array($value)) { break; } // Create a listener that checks the query string against // the whitelisted query parameters in order to seed the // collection route options. $whitelist = $value; $controller->getEventManager()->attach('getList.pre', function (Event $e) use($whitelist) { $controller = $e->getTarget(); $resource = $controller->getResource(); if (!$resource instanceof Resource) { // ResourceInterface does not define setQueryParams, so we need // specifically a Resource instance return; } $request = $controller->getRequest(); if (!method_exists($request, 'getQuery')) { return; } $query = $request->getQuery(); $params = new Parameters(array()); foreach ($query as $key => $value) { if (!in_array($key, $whitelist)) { continue; } $params->set($key, $value); } $resource->setQueryParams($params); }); $controller->getEventManager()->attach('getList.post', function (Event $e) use($whitelist) { $controller = $e->getTarget(); $resource = $controller->getResource(); if (!$resource instanceof Resource) { // ResourceInterface does not define setQueryParams, so we need // specifically a Resource instance return; } $collection = $e->getParam('collection'); if (!$collection instanceof Collection) { return; } $params = $resource->getQueryParams()->getArrayCopy(); // Set collection route options with the captured query whitelist, to // ensure paginated links are generated correctly $collection->setCollectionRouteOptions(array('query' => $params)); // If no self link defined, set the options in the collection and return $links = $collection->getLinks(); if (!$links->has('self')) { return; } // If self link is defined, but is not route-based, return $self = $links->get('self'); if (!$self->hasRoute()) { return; } // Otherwise, merge the query string parameters with // the self link's route options $self = $links->get('self'); $options = $self->getRouteOptions(); $self->setRouteOptions(array_merge($options, array('query' => $params))); }); break; case 'entity_http_methods': $controller->setEntityHttpMethods($value); break; /** * The identifierName is a property of the ancestor * and is described by Apigility as route_identifier_name */ /** * The identifierName is a property of the ancestor * and is described by Apigility as route_identifier_name */ case 'route_identifier_name': $controller->setIdentifierName($value); break; case 'page_size': $controller->setPageSize($value); break; case 'page_size_param': $controller->setPageSizeParam($value); break; /** * @todo Remove this by 1.0; BC only, starting in 0.9.0 */ /** * @todo Remove this by 1.0; BC only, starting in 0.9.0 */ case 'resource_http_methods': $controller->setEntityHttpMethods($value); break; case 'route_name': $controller->setRoute($value); break; } } }