Esempio n. 1
0
 /**
  * @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);
     }
 }