private function orderResource($resourceName, &$localStack = [])
{
$providerName = isset($this->obtainableIn[$resourceName]) ? $this->obtainableIn[$resourceName] : null;
if ($providerName === null) {
throw new ResourceUndefinedException("One of service providers could not be ordered because of undefined resource [{$resourceName}].");
}
if (isset($this->ordered[$resourceName])) {
return [];
}
if (isset($localStack[$resourceName])) {
throw new OverflowException("Service {$providerName} could not be ordered because of circular dependency to resource [{$resourceName}].");
}
$reqs = $this->reqs[$providerName];
$pvds = $this->pvds[$providerName];
$localOrder = [];
$localStack[$resourceName] = true;
foreach ($reqs as $resourceReq) {
$localOrder = array_merge($localOrder, $this->orderResource($resourceReq, $localStack));
}
foreach ($pvds as $resourcePvd) {
$this->ordered[$resourcePvd] = true;
}
$localOrder[] = $providerName;
return $localOrder;
}