PluginProbe
Packeta / trunk
Packeta vtrunk
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / deps / nette / di / src / DI / Config / Loader.php

Loader.php in Packeta trunk, at deps/nette/di/src/DI/Config/Loader.php

101 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * This file is part of the Nette Framework (https://nette.org)
5 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6 */
7 declare (strict_types=1);
8 namespace Packetery\Nette\DI\Config;
9
10 use Packetery\Nette;
11 use Packetery\Nette\Utils\Validators;
12 /**
13 * Configuration file loader.
14 */
15 class Loader
16 {
17 use \Packetery\Nette\SmartObject;
18 private const IncludesKey = 'includes';
19 private $adapters = ['php' => Adapters\PhpAdapter::class, 'neon' => Adapters\NeonAdapter::class];
20 private $dependencies = [];
21 private $loadedFiles = [];
22 private $parameters = [];
23 /**
24 * Reads configuration from file.
25 */
26 public function load(string $file, ?bool $merge = \true) : array
27 {
28 if (!\is_file($file) || !\is_readable($file)) {
29 throw new \Packetery\Nette\FileNotFoundException(\sprintf("File '%s' is missing or is not readable.", $file));
30 }
31 if (isset($this->loadedFiles[$file])) {
32 throw new \Packetery\Nette\InvalidStateException(\sprintf("Recursive included file '%s'", $file));
33 }
34 $this->loadedFiles[$file] = \true;
35 $this->dependencies[] = $file;
36 $data = $this->getAdapter($file)->load($file);
37 $res = [];
38 if (isset($data[self::IncludesKey])) {
39 Validators::assert($data[self::IncludesKey], 'list', "section 'includes' in file '{$file}'");
40 $includes = \Packetery\Nette\DI\Helpers::expand($data[self::IncludesKey], $this->parameters);
41 foreach ($includes as $include) {
42 $include = $this->expandIncludedFile($include, $file);
43 $res = \Packetery\Nette\Schema\Helpers::merge($this->load($include, $merge), $res);
44 }
45 }
46 unset($data[self::IncludesKey], $this->loadedFiles[$file]);
47 if ($merge === \false) {
48 $res[] = $data;
49 } else {
50 $res = \Packetery\Nette\Schema\Helpers::merge($data, $res);
51 }
52 return $res;
53 }
54 /** @deprecated */
55 public function save(array $data, string $file) : void
56 {
57 \trigger_error(__METHOD__ . "() is deprecated, use adapter's dump() method.", \E_USER_DEPRECATED);
58 if (\file_put_contents($file, $this->getAdapter($file)->dump($data)) === \false) {
59 throw new \Packetery\Nette\IOException(\sprintf("Cannot write file '%s'.", $file));
60 }
61 }
62 /**
63 * Returns configuration files.
64 */
65 public function getDependencies() : array
66 {
67 return \array_unique($this->dependencies);
68 }
69 /**
70 * Expands included file name.
71 */
72 public function expandIncludedFile(string $includedFile, string $mainFile) : string
73 {
74 return \preg_match('#([a-z]+:)?[/\\\\]#Ai', $includedFile) ? $includedFile : \dirname($mainFile) . '/' . $includedFile;
75 }
76 /**
77 * Registers adapter for given file extension.
78 * @param string|Adapter $adapter
79 * @return static
80 */
81 public function addAdapter(string $extension, $adapter)
82 {
83 $this->adapters[\strtolower($extension)] = $adapter;
84 return $this;
85 }
86 private function getAdapter(string $file) : Adapter
87 {
88 $extension = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));
89 if (!isset($this->adapters[$extension])) {
90 throw new \Packetery\Nette\InvalidArgumentException(\sprintf("Unknown file extension '%s'.", $file));
91 }
92 return \is_object($this->adapters[$extension]) ? $this->adapters[$extension] : new $this->adapters[$extension]();
93 }
94 /** @return static */
95 public function setParameters(array $params)
96 {
97 $this->parameters = $params;
98 return $this;
99 }
100 }
101