Skip to content

Commit

Permalink
Add merge method for configs.
Browse files Browse the repository at this point in the history
  • Loading branch information
vasiliishvakin committed Aug 27, 2017
1 parent 5c9583c commit a5ddd30
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/ConfigLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ protected function read($level, $name = self::NAME_CONFIG)
foreach ($dirs as $dir) {
$dirContent = $dir->getContent($name);
$dirContent = $this->postProcess($dirContent, $dir, $name, $level);
$config = ArrayTools::mergeRecursiveDisabled($config, $dirContent);
$config = ConfigTools::merge($config, $dirContent);
}
return $config;
}
Expand All @@ -217,7 +217,7 @@ public function getConfig($name = self::NAME_CONFIG)
$levels = $this->getLevels();
$config = [];
foreach ($levels as $level) {
$config = ArrayTools::mergeRecursiveDisabled($config, $this->read($level, $name));
$config = ConfigTools::merge($config, $this->read($level, $name));
}
$this->config[$name] = new Config($config, $this->getDiContainer());
}
Expand Down
48 changes: 48 additions & 0 deletions src/ConfigTools.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php


namespace Akademiano\Config;


class ConfigTools
{
/**
* @param array
* @param array
* @return array
*/
public static function merge()
{
$arrays = func_get_args();
$merged = array_shift($arrays);
foreach ($arrays as $currentArray) {
foreach ($currentArray as $key => $value) {
if (is_array($value) && isset ($merged[$key]) && is_array($merged[$key])) {
$merged[$key] = self::merge($merged[$key], $value);
} else {
//проверяем что это не отключение параметров
$unSetted = false;
if ($value === null && !is_integer($key)) {
if (false !== $keyMerged = array_search($key, $merged)) {
if (is_integer($keyMerged)) {
unset($merged[$keyMerged]);
$unSetted = true;
}
}
}
if (!$unSetted) {
//Числовой ключ добавляем, если такого значения нет, иначе заменяем
if (is_integer($key) && is_string($value)) {
if (!array_search($value, $merged)) {
$merged[] = $value;
}
} else {
$merged[$key] = $value;
}
}
}
}
}
return $merged;
}
}
3 changes: 2 additions & 1 deletion src/FS/ConfigDir.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Akademiano\Config\Exception\ConfigFileInvalidTypeException;
use Akademiano\Utils\ArrayTools;
use Akademiano\Utils\FileSystem;
use Akademiano\Config\ConfigTools;

class ConfigDir
{
Expand Down Expand Up @@ -174,7 +175,7 @@ protected function read($configName)
$files = $this->getFiles($configName);
$content = [];
foreach ($files as $file) {
$content = ArrayTools::mergeRecursiveDisabled($content, $file->getContent());
$content = ConfigTools::merge($content, $file->getContent());
}
return $content;
}
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/ConfigLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ protected function _before()
$configDefaultLocal = include $configDir . DIRECTORY_SEPARATOR . "local.config.php";

$this->configDefault = new Akademiano\Config\Config(
\Akademiano\Utils\ArrayTools::mergeRecursiveDisabled(
\Akademiano\Config\ConfigTools::merge(
$configDefaultGlobal,
$configDefaultLocal
)
Expand Down

0 comments on commit a5ddd30

Please sign in to comment.