/**
* Returns a route and replaces tokenized parts of the string with
* the passed params
*
* @param $name
* @param array $params
*
* @return mixed The default routes, or if $name is set to `findAll`, any of the following formats
* based on the parent chain
* GET /api/v2/groups.json
* GET /api/v2/users/{user_id}/groups.json
*
* @throws \Exception
*/
public function getRoute($name, array $params = [])
{
$lastChained = $this->getLatestChainedParameter([self::class]);
$chainableRoutes = ['findAll', 'find', 'create', 'delete', 'assignable'];
if (empty($lastChained) || !in_array($name, $chainableRoutes)) {
return parent::getRoute($name, $params);
}
$chainedResourceId = reset($lastChained);
$chainedResourceNames = array_keys($lastChained);
$chainedResourceName = (new $chainedResourceNames[0]($this->client))->resourceName;
if ($name === 'assignable' && $chainedResourceName === 'groups') {
return "{$chainedResourceName}/{$chainedResourceId}/memberships/assignable.json";
}
if ($name === 'create' && $chainedResourceName === 'users') {
return "{$chainedResourceName}/{$chainedResourceId}/{$this->resourceName}.json";
}
if (in_array($name, ['find', 'delete']) && $chainedResourceName === 'users') {
return "{$chainedResourceName}/{$chainedResourceId}/{$this->resourceName}/{$params['id']}.json";
}
if ($name === 'findAll') {
if ($chainedResourceName === 'groups') {
return "{$chainedResourceName}/{$chainedResourceId}/memberships.json";
} elseif ($chainedResourceName === 'users') {
return "{$chainedResourceName}/{$chainedResourceId}/group_memberships.json";
}
}
throw new RouteException('Route not found.');
}