Add TMultiLevelProperties for multi-level support
+ No default properties in GenericConfig + EnvConfig throws Exception if config file not found2.x
parent
7dea458c68
commit
016c97c875
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace jrosset\EnvReader;
|
||||
|
||||
use jrosset\ArrayClasses\IArrayClass;
|
||||
use jrosset\ArrayClasses\ImmutableArrayClass;
|
||||
use UnexpectedValueException;
|
||||
|
||||
/**
|
||||
* Trait for multi-level properties
|
||||
*/
|
||||
trait TMultiLevelProperties {
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function hasProperty (string $name): bool {
|
||||
$levels = $this->getPropertyLevels($name);
|
||||
|
||||
$value = $this->getProperties();
|
||||
foreach ($levels as $level) {
|
||||
if ($value instanceof IArrayClass) {
|
||||
if (!$value->has($level)) {
|
||||
return false;
|
||||
}
|
||||
$value = $value->get($level);
|
||||
}
|
||||
else {
|
||||
if (!isset($value[$level])) {
|
||||
return false;
|
||||
}
|
||||
$value = $value[$level];
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getProperty (string $name, $default = null) {
|
||||
if (!$this->hasProperty($name)) {
|
||||
if ($default === null) {
|
||||
throw new UnexpectedValueException('The "' . $name . '" property is not set');
|
||||
}
|
||||
return $default;
|
||||
}
|
||||
|
||||
$levels = $this->getPropertyLevels($name);
|
||||
|
||||
$value = $this->getProperties();
|
||||
foreach ($levels as $level) {
|
||||
if ($value instanceof IArrayClass) {
|
||||
$value = $value->get($level);
|
||||
}
|
||||
else {
|
||||
$value = $value[$level];
|
||||
}
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
/**
|
||||
* Provide the multi-level separator
|
||||
*
|
||||
* Reimplements to override
|
||||
*
|
||||
* @return string The separator
|
||||
*/
|
||||
protected function getPropertySeparator (): string {
|
||||
return '/';
|
||||
}
|
||||
/**
|
||||
* Get array of levels of a property name
|
||||
*
|
||||
* @param string $propertyName The property name
|
||||
*
|
||||
* @return ImmutableArrayClass The property levels
|
||||
*/
|
||||
private function getPropertyLevels (string $propertyName): ImmutableArrayClass {
|
||||
return new ImmutableArrayClass(explode($this->getPropertySeparator(), $propertyName));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue