/** * @param FREST\Resource $resource * @param array $readSettings * @throws FREST\Exception */ private function addRequiredReadSettings($resource, &$readSettings) { $requiredReadSettings = array(); $resourceName = $resource->getName(); $allReadSettings = $resource->getReadSettings(); // find any aliases necessary for calculation of a computed alias that are not already defined in the read Setting foreach ($readSettings as $readSetting) { if ($readSetting instanceof Setting\ComputedRead) { /** @var Setting\ComputedRead $readSetting */ $requiredAliases = $readSetting->getRequiredAliases(); foreach ($requiredAliases as $requiredAliasFull) { $subAliases = NULL; $requiredAlias = self::getHandleAndValues($requiredAliasFull, $subAliases) ?: $requiredAliasFull; // TODO: error check required alias if (!isset($readSettings[$requiredAlias]) && !isset($requiredReadSettings[$requiredAlias])) { // if it's not already there $requiredReadSetting = $allReadSettings[$requiredAlias]; $requiredReadSettings[$requiredAlias] = $requiredReadSetting; $this->requiredAliasesAdded[$resourceName][$requiredAlias] = $requiredAlias; if (isset($subAliases)) { if (!$requiredReadSetting instanceof Setting\SingularResourceRead) { throw new FREST\Exception(FREST\Exception::Config, "The required alias '{$requiredAlias}' on resource '{$resourceName}' is not a resource and should contain partial object syntax"); } $loadedResource = $this->getLoadedResource($requiredReadSetting->getResourceName()); $loadedResourceReadSettings = $loadedResource->getReadSettings(); // find read Setting for partial syntax that were defined in required alias config $subReadSettings = array(); foreach ($subAliases as $subAlias) { $subReadSettings[$subAlias] = $loadedResourceReadSettings[$subAlias]; } $this->partialSubReadSettings[$requiredAlias] = $subReadSettings; } } $requiredReadSetting = isset($readSettings[$requiredAlias]) ? $readSettings[$requiredAlias] : (isset($requiredReadSettings[$requiredAlias]) ? $requiredReadSettings[$requiredAlias] : NULL); if (!isset($requiredReadSetting)) { // generate a new read setting $requiredReadSetting = $allReadSettings[$requiredAlias]; $requiredReadSettings[$requiredAlias] = $requiredReadSetting; $this->requiredAliasesAdded[$resourceName][$requiredAlias] = $subAliases ?: TRUE; } if (isset($subAliases)) { if (!$requiredReadSetting instanceof Setting\SingularResourceRead) { throw new FREST\Exception(FREST\Exception::Config, "The required alias '{$requiredAlias}' on resource '{$resourceName}' is not a resource and should not contain partial object syntax"); } $loadedResource = $this->getLoadedResource($requiredReadSetting->getResourceName()); $loadedResourceReadSettings = $loadedResource->getReadSettings(); if (isset($this->partialSubReadSettings[$requiredAlias])) { // add another required subalias $subAliasesAdded = array(); foreach ($subAliases as $subAlias) { if (!isset($this->partialSubReadSettings[$requiredAlias][$subAlias])) { $this->partialSubReadSettings[$requiredAlias][$subAlias] = $loadedResourceReadSettings[$subAlias]; $subAliasesAdded[] = $subAlias; } } foreach ($subAliasesAdded as $subAlias) { $this->requiredAliasesAdded[$resourceName][$requiredAlias][] = $subAlias; } } else { // find read Setting for partial syntax that were defined in required alias config $subReadSettings = array(); foreach ($subAliases as $subAlias) { $subReadSettings[$subAlias] = $loadedResourceReadSettings[$subAlias]; } $this->partialSubReadSettings[$requiredAlias] = $subReadSettings; } } } } else { if ($readSetting instanceof Setting\SingularResourceRead) { // add default sub read settings if needed // these lines might also need to be added for Setting\PluralResourceRead as well $alias = $readSetting->getAlias(); if (!isset($this->partialSubReadSettings[$alias])) { $loadedResource = $this->getLoadedResource($readSetting->getResourceName()); $subReadSettings = $this->getLoadedResourceReadSettings($loadedResource, $readSetting); $this->partialSubReadSettings[$alias] = $subReadSettings; } } else { if ($readSetting instanceof Setting\PluralResourceRead) { $injectedRequiredAliases = $readSetting->getRequiredAliases(); foreach ($injectedRequiredAliases as $injectedAlias) { if (!isset($allReadSettings[$injectedAlias])) { throw new FREST\Exception(FREST\Exception::Config, "Injected alias '{$injectedAlias}' is invalid in resource {$resourceName}"); } if (!isset($readSettings[$injectedAlias]) && !isset($requiredReadSettings[$injectedAlias])) { // if it's not already there $requiredReadSettings[$injectedAlias] = $allReadSettings[$injectedAlias]; $this->requiredAliasesAdded[$resourceName][$injectedAlias] = TRUE; // used to have value of $injectedAlias } } } } } } if (count($requiredReadSettings) > 0) { $readSettings = array_merge($readSettings, $requiredReadSettings); $this->addRequiredReadSettings($resource, $readSettings); } }