/** * @inheritdoc */ public function process(ParserInterface $parser, string $file, array $data) : array { if (false === array_key_exists('include', $data)) { throw InvalidArgumentExceptionFactory::createForNoIncludeStatementInData($file); } $include = $data['include']; unset($data['include']); if (null === $include) { return $data; } if (false === is_array($include)) { throw TypeErrorFactory::createForInvalidIncludeStatementInData($include, $file); } foreach ($include as $includeFile) { if (false === is_string($includeFile)) { throw TypeErrorFactory::createForInvalidIncludedFilesInData($includeFile, $file); } if (0 === strlen($includeFile)) { throw InvalidArgumentExceptionFactory::createForEmptyIncludedFileInData($file); } $filePathToInclude = $this->fileLocator->locate($includeFile, dirname($file)); $fileToIncludeData = $parser->parse($filePathToInclude); if (array_key_exists('include', $fileToIncludeData)) { $fileToIncludeData = $this->process($parser, $file, $fileToIncludeData); } $data = $this->dataMerger->mergeInclude($data, $fileToIncludeData); } return $data; }
/** * @inheritdoc */ public function parse(string $file) : array { try { $realPath = $this->fileLocator->locate($file); } catch (FileNotFoundException $exception) { throw InvalidArgumentExceptionFactory::createForFileCouldNotBeFound($file, 0, $exception); } if (array_key_exists($realPath, $this->cache)) { return $this->cache[$realPath]; } $data = $this->parser->parse($realPath); if (array_key_exists('include', $data)) { $data = $this->includeProcessor->process($this, $file, $data); } $this->cache[$realPath] = $data; return $data; }
/** * @inheritdoc */ public function loadFile(string $file, array $parameters = [], array $objects = []) : ObjectSet { $data = $this->parser->parse($file); return $this->dataLoader->loadData($data, $parameters, $objects); }