diff --git a/Resources/doc/changelogs/CHANGELOG-3.x.md b/Resources/doc/changelogs/CHANGELOG-3.x.md
index 24541e8..1f4b12b 100644
--- a/Resources/doc/changelogs/CHANGELOG-3.x.md
+++ b/Resources/doc/changelogs/CHANGELOG-3.x.md
@@ -10,6 +10,10 @@
* Fixed an issue with synchronous scrolling, where when the first node of a list was unique
to said list, the synchronous scrolling would throw an error and never complete
+* Improved config path retrieval: Now the process is able to find configuration files more effectively
+ and easily and should be aware of every used file for configuration except for the custom bundle config
+ which is conducted by the bundles themselves.
+
## 3.0 (11.12.2020)
* This changelog has been created to ship with the first full version of the bundle
diff --git a/src/LocationAwareConfigLoadBundle/ConfigPathUtility.php b/src/LocationAwareConfigLoadBundle/ConfigPathUtility.php
index ab0944a..7b1dc94 100644
--- a/src/LocationAwareConfigLoadBundle/ConfigPathUtility.php
+++ b/src/LocationAwareConfigLoadBundle/ConfigPathUtility.php
@@ -71,9 +71,7 @@ public static function initializePathUtility(): void
// Parse the manual path_config-file
self::getUserDefinedPaths();
- } catch (InvalidArgumentException $e) {
- self::$configPaths = [];
- } catch (Exception $error) {
+ } catch (InvalidArgumentException | Exception $e) {
self::$configPaths = [];
}
}
@@ -90,25 +88,27 @@ public static function initializePathUtility(): void
* @param string $extensionPath The path pointing to a bundle's ExtensionClass.
* @return string|null Returns the converted string or null, if the path does not point to the DependencyInjection or a directory which does not exist.
*/
- public static function convertExtensionPathToConfigDirectory(string $extensionPath) {
- // Get the index in the string where "DependencyInjection" is present
- $diPosition = strpos($extensionPath,"DependencyInjection");
+ public static function convertExtensionPathToConfigDirectory(string $extensionPath): ?string
+ {
+ $configDirPath = preg_match("/\.php$/",$extensionPath)? dirname($extensionPath) : $extensionPath;
- if(!$diPosition) {
- return null;
+ if (preg_match("/\/$/", $configDirPath)) {
+ $configDirPath = substr($configDirPath,0,strlen($configDirPath)-1);
}
- // Change it from DependencyInjection to the config directory
- $configDirPath = substr($extensionPath,0,$diPosition)."Resources/config/";
+ while (!preg_match("/.*\/vendor\/?$/", $configDirPath)) {
+ if (file_exists($configDirPath.DIRECTORY_SEPARATOR."Resources".DIRECTORY_SEPARATOR."config")) {
+ $configDirPath = $configDirPath.DIRECTORY_SEPARATOR."Resources".DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR;
+ break;
+ } else if (file_exists($configDirPath.DIRECTORY_SEPARATOR."config")) {
+ $configDirPath = $configDirPath.DIRECTORY_SEPARATOR."config".DIRECTORY_SEPARATOR;
+ break;
+ }
- if (!file_exists($configDirPath)) {
- return null;
+ $configDirPath = dirname($configDirPath);
}
- // Since the entire directory is added as a glob resource, the "*" signals that all files within the directory are
- // to be looked at (only one level deep) and the extensions signal that only files which end on one of the config
- // extensions are considered.
- return $configDirPath."*".self::$configExtensions;
+ return preg_match("/\/$/", $configDirPath)? $configDirPath."*".self::$configExtensions : null;
}
/**
@@ -118,7 +118,8 @@ public static function convertExtensionPathToConfigDirectory(string $extensionPa
* @param string $configPath The path to be added to the list.
* @param bool $isGlobPattern A boolean stating whether the path is a glob-resource / pattern which will have to be loaded differently from non-glob-pattern.
*/
- public static function addPathToPathlist(string $configPath, bool $isGlobPattern = true): void {
+ public static function addPathToPathlist(string $configPath, bool $isGlobPattern = true): void
+ {
// If the cache has not been initialised, initialise it.
if (!self::$cacheInitialized) {
self::initializePathUtility();
@@ -137,7 +138,8 @@ public static function addPathToPathlist(string $configPath, bool $isGlobPattern
*
*
Also signals, that a restart of the load process is useful / necessary.
*/
- public static function storePaths(): void {
+ public static function storePaths(): void
+ {
if (self::$cacheInitialized && self::$pathsChanged) {
try {
self::$configPathCache->delete("cjw_config_paths");
@@ -234,7 +236,8 @@ private static function getUserDefinedPaths(): void
* @param array $path A path array (hopefully with 3 items under the keys of "path", "glob" and "addConfExt").
* @return bool Boolean which states whether the path at least passes the most basic checks regarding their structure.
*/
- private static function checkUserDefinedPath(array $path): bool {
+ private static function checkUserDefinedPath(array $path): bool
+ {
if (is_array($path) && count($path) === 3) {
if (!(key_exists("path",$path) && is_string($path["path"]) && !empty($path["path"]))) {
return false;
diff --git a/src/LocationAwareConfigLoadBundle/CustomContainerBuilder.php b/src/LocationAwareConfigLoadBundle/CustomContainerBuilder.php
index ab4dc86..951aa3a 100644
--- a/src/LocationAwareConfigLoadBundle/CustomContainerBuilder.php
+++ b/src/LocationAwareConfigLoadBundle/CustomContainerBuilder.php
@@ -6,6 +6,7 @@
use Exception;
use ReflectionClass;
+use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
@@ -33,14 +34,22 @@ public function __construct()
*
* @param string $location The location to be set.
*/
- public function setCurrentLocation(string $location) {
-
+ public function setCurrentLocation(string $location)
+ {
/** The parameterBag is the custom one created to feature such a function */
$this->parameterBag->setCurrentLocation($location);
}
/**
* @override
+ * In order to be able to actively influence the way locations are read for parameters during the bundle configuration
+ * process, the compilation of the container is caught through this function and then, after the measures for the
+ * bundle configuration are set in place, the normal compilation process of the container takes place.
+ *
+ *
This was done in order to prevent the bundles from constantly adding the same parameters unchanged back into
+ * the container, which led to dozens of useless entries into the location lists for every parameter.
+ *
+ * @param bool $resolveEnvPlaceholders
*/
public function compile(bool $resolveEnvPlaceholders = false)
{
@@ -61,6 +70,7 @@ public function compile(bool $resolveEnvPlaceholders = false)
* config directories to be tracked.
*
* @param string $name The name of the bundle who's extension config to retrieve.
+ *
* @return array Returns the found configuration.
*/
public function getExtensionConfig(string $name)
@@ -90,6 +100,8 @@ public function getExtensionConfig(string $name)
* @override
* This override ensures, that no definition of a service will be added while loading the config files of the bundles
* outside of the bundle configuration phase.
+ *
+ * @param array $definitions
*/
public function addDefinitions(array $definitions)
{
@@ -102,8 +114,13 @@ public function addDefinitions(array $definitions)
* @override
* This override ensures, that no service will be registered while loading the config files of the bundles
* outside of the bundle configuration phase.
+ *
+ * @param string $id
+ * @param string|null $class
+ *
+ * @return Definition|null
*/
- public function register(string $id, string $class = null)
+ public function register(string $id, string $class = null): ?Definition
{
if (!$this->isBundleConfigMode) {
return parent::register($id, $class); // TODO: Change the autogenerated stub
@@ -116,8 +133,13 @@ public function register(string $id, string $class = null)
* @override
* This override ensures, that no service definition will be added while loading the config files of the bundles
* outside of the bundle configuration phase.
+ *
+ * @param string $id
+ * @param Definition $definition
+ *
+ * @return Definition|null
*/
- public function setDefinition(string $id, Definition $definition)
+ public function setDefinition(string $id, Definition $definition): ?Definition
{
if (!$this->isBundleConfigMode) {
return parent::setDefinition($id, $definition); // TODO: Change the autogenerated stub
@@ -130,11 +152,16 @@ public function setDefinition(string $id, Definition $definition)
* @override
* This override ensures, that no service alias will be set while loading the config files of the bundles
* outside of the bundle configuration phase.
+ *
+ * @param string $alias
+ * @param $id
+ *
+ * @return string|Alias|null
*/
public function setAlias(string $alias, $id)
{
if (!$this->isBundleConfigMode) {
- return parent::setAlias($alias, $id); // TODO: Change the autogenerated stub
+ return parent::setAlias($alias, $id);
}
return null;
@@ -144,11 +171,13 @@ public function setAlias(string $alias, $id)
* @override
* This override ensures, that no service definition will be registered while loading the config files of the bundles
* outside of the bundle configuration phase.
+ *
+ * @param array $definitions
*/
public function setDefinitions(array $definitions)
{
if (!$this->isBundleConfigMode) {
- parent::setDefinitions($definitions); // TODO: Change the autogenerated stub
+ parent::setDefinitions($definitions);
}
}
diff --git a/src/LocationAwareConfigLoadBundle/CustomDelegatingLoader.php b/src/LocationAwareConfigLoadBundle/CustomDelegatingLoader.php
index 4f1a945..27526ba 100644
--- a/src/LocationAwareConfigLoadBundle/CustomDelegatingLoader.php
+++ b/src/LocationAwareConfigLoadBundle/CustomDelegatingLoader.php
@@ -4,6 +4,7 @@
namespace CJW\CJWConfigProcessor\src\LocationAwareConfigLoadBundle;
+use Exception;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolverInterface;
@@ -32,9 +33,11 @@ public function __construct(LoaderResolverInterface $resolver, CustomContainerBu
* @override
* This override ensures that everytime a resource is loaded (which is not a global pattern) the path to said resource is set
* in and known by the container.
+ *
* @param $resource
* @param string|null $type
- * @throws \Exception
+ *
+ * @throws Exception
*/
public function load($resource, string $type = null)
{
diff --git a/src/LocationAwareConfigLoadBundle/CustomGlobLoader.php b/src/LocationAwareConfigLoadBundle/CustomGlobLoader.php
index ab7788e..bad28d9 100644
--- a/src/LocationAwareConfigLoadBundle/CustomGlobLoader.php
+++ b/src/LocationAwareConfigLoadBundle/CustomGlobLoader.php
@@ -38,8 +38,10 @@ public function __construct(CustomContainerBuilder $container, FileLocatorInterf
* This override is basically a copy of the {@see GlobLoader} load function just with one key difference:
* It tracks the paths gathered by GlobResources and always relays that path before the loading process
* of the parameters and services begins.
+ *
* @param $resource
* @param string|null $type
+ *
* @throws FileLoaderImportCircularReferenceException
* @throws LoaderLoadException
*/
diff --git a/src/LocationAwareConfigLoadBundle/CustomValueStorage.php b/src/LocationAwareConfigLoadBundle/CustomValueStorage.php
index 6ad1d43..faff2db 100644
--- a/src/LocationAwareConfigLoadBundle/CustomValueStorage.php
+++ b/src/LocationAwareConfigLoadBundle/CustomValueStorage.php
@@ -14,16 +14,24 @@
class CustomValueStorage
{
- /** @var array This is an array of all locations that have been encountered during the loading process. */
+ /**
+ * @var array This is an array of all locations that have been encountered during the loading process.
+ */
private static $encounteredLocations = [];
- /** @var array An array of all parameters being loaded by the config loading process and the values accompanied by the paths they stem from. */
+ /**
+ * @var array An array of all parameters being loaded by the config loading process and the values accompanied by the paths they stem from.
+ */
private static $parameterAndTheirLocations = [];
- /** @var bool States whether new parameter values or paths can be added to the internal arrays or not. */
+ /**
+ * @var bool States whether new parameter values or paths can be added to the internal arrays or not.
+ */
private static $allowWrite = true;
- /** @var bool States whether the bundle config loading process has begun. */
+ /**
+ * @var bool States whether the bundle config loading process has begun.
+ */
private static $bundleConfig = false;
/**
@@ -41,7 +49,8 @@ class CustomValueStorage
* @param mixed $value The value attached to both the parametername and then the given path as well. It is going to be added under path-key as an entry of the array.
* @param string $path The path (the origin) of the parameter value that is being set. It serves as a key under the parameter-key of the array.
*/
- public static function addParameterOrLocation(string $parameterName, $value, string $path) {
+ public static function addParameterOrLocation(string $parameterName, $value, string $path): void
+ {
// Only if it is currently allowed to write, will the process even begin
if (self::$allowWrite) {
if (!in_array($path, self::$encounteredLocations)) {
@@ -66,7 +75,8 @@ public static function addParameterOrLocation(string $parameterName, $value, str
* It simply sets an internal boolean which then prohibits any parameters or paths / values to be set.
* In order to unlock the writing process, use {@see unlockParameters()}.
*/
- public static function lockParameters() {
+ public static function lockParameters(): void
+ {
self::$allowWrite = false;
}
@@ -75,7 +85,8 @@ public static function lockParameters() {
* to the internal parameter-and-path storage. It sets the internal boolean to a different value
* than {@see lockParameters()}.
*/
- public static function unlockParameters() {
+ public static function unlockParameters(): void
+ {
self::$allowWrite = true;
}
@@ -91,7 +102,8 @@ public static function unlockParameters() {
*
* @param bool $activate A boolean stating that the mode is either to be active (true) or not (false).
*/
- public static function activateBundleConfigMode(bool $activate) {
+ public static function activateBundleConfigMode(bool $activate): void
+ {
self::$bundleConfig = $activate;
}
@@ -100,7 +112,8 @@ public static function activateBundleConfigMode(bool $activate) {
* bundleConfigMode and the lock-status of the class internally. This serves to allow a "fresh" start with the internal
* storage.
*/
- public static function reset(): void {
+ public static function reset(): void
+ {
self::$parameterAndTheirLocations = [];
self::$bundleConfig = false;
self::$allowWrite = true;
@@ -112,7 +125,8 @@ public static function reset(): void {
*
* @return array Returns an array of parameters as super-keys, the locations as sub-keys and the values found at the paths as entries.
*/
- public static function getParametersAndTheirLocations() {
+ public static function getParametersAndTheirLocations(): array
+ {
ksort(self::$parameterAndTheirLocations,SORT_STRING);
return self::$parameterAndTheirLocations;
}
@@ -123,7 +137,8 @@ public static function getParametersAndTheirLocations() {
*
* @return array Returns an array which is filled with all encountered locations during the configuration-loading-process.
*/
- public static function getEncounteredLocations() {
+ public static function getEncounteredLocations(): array
+ {
return self::$encounteredLocations;
}
@@ -131,9 +146,11 @@ public static function getEncounteredLocations() {
* Allows a specific parameter to be retrieved from the internal storage of the class.
*
* @param string $parameterName The name of the parameter as string.
+ *
* @return array|null Returns the internal array with `$path => $value` pairs or null if the parameter is not present in the internal array.
*/
- public static function getLocationsForSpecificParameter(string $parameterName) {
+ public static function getLocationsForSpecificParameter(string $parameterName): ?array
+ {
// Only if that parameter exists as a key in the array, will that parameters paths and values be returned, otherwise null
return isset(self::$parameterAndTheirLocations[$parameterName]) ?
self::$parameterAndTheirLocations[$parameterName] : null;
diff --git a/src/LocationAwareConfigLoadBundle/LoadInitializer.php b/src/LocationAwareConfigLoadBundle/LoadInitializer.php
index 9b18cdf..b4a1bc6 100644
--- a/src/LocationAwareConfigLoadBundle/LoadInitializer.php
+++ b/src/LocationAwareConfigLoadBundle/LoadInitializer.php
@@ -27,6 +27,9 @@
*/
class LoadInitializer extends Kernel
{
+ /**
+ * @var Kernel An instance of the actual Symfony kernel handling all the requests (to ensure the correct paths are used).
+ */
private $kernel;
public function __construct(string $environment, bool $debug)
@@ -64,7 +67,7 @@ public function __construct(string $environment, bool $debug)
*
* @return string Returns the determined cache directory.
*/
- public function getCacheDir()
+ public function getCacheDir(): string
{
if ($this->kernel) {
return $this->kernel->getCacheDir();
@@ -93,7 +96,7 @@ public function getCacheDir()
*
* @return string Returns the determined project directory.
*/
- public function getProjectDir()
+ public function getProjectDir(): string
{
if ($this->kernel) {
return $this->kernel->getProjectDir();
@@ -115,10 +118,12 @@ public function getProjectDir()
* @override
* Overrides the standard function of the kernel in order to ensure, that the right CustomContainerBuilder and CustomLoaders
* are being used for the config loading process.
+ *
* @param ContainerInterface $container
+ *
* @return CustomDelegatingLoader
*/
- protected function getContainerLoader(ContainerInterface $container)
+ protected function getContainerLoader(ContainerInterface $container): CustomDelegatingLoader
{
$locator = new FileLocator($this);
/** @var CustomContainerBuilder $container */
@@ -139,7 +144,7 @@ protected function getContainerLoader(ContainerInterface $container)
* @override
* Overrides the standard function of the kernel in order to ensure, that the kernel works with the CustomContainerBuilder.
*/
- protected function getContainerBuilder()
+ protected function getContainerBuilder(): CustomContainerBuilder
{
$originalContainerBuilder = parent::getContainerBuilder();
$customContainerBuilder = new CustomContainerBuilder();
@@ -147,10 +152,16 @@ protected function getContainerBuilder()
return $customContainerBuilder;
}
- protected function configureContainer(
- ContainerBuilder $container,
- LoaderInterface $loader
- ): void {
+ /**
+ * @override
+ * Overrides the standard kernel functionality to ensure that the paths retrieved in the previous boot attempt
+ * of this custom kernel are used too, to retrieve the desired parameter paths.
+ *
+ * @param ContainerBuilder $container
+ * @param LoaderInterface $loader
+ */
+ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
+ {
parent::configureContainer($container, $loader);
// After the original Symfony-Loading of specific routes, the custom routes, added in the configuration, are being parsed through
@@ -176,7 +187,8 @@ protected function configureContainer(
*
* It is employed to allow a reboot to occur during the loading process (in order to take newly found config-paths into account).
*/
- private function cleanUpCache() {
+ private function cleanUpCache(): void
+ {
$glob = glob($this->getCacheDir()."/*");
foreach ($glob as $file) {
diff --git a/src/LocationAwareConfigLoadBundle/LocationAwareParameterBag.php b/src/LocationAwareConfigLoadBundle/LocationAwareParameterBag.php
index b0f5f46..f532078 100644
--- a/src/LocationAwareConfigLoadBundle/LocationAwareParameterBag.php
+++ b/src/LocationAwareConfigLoadBundle/LocationAwareParameterBag.php
@@ -5,12 +5,20 @@
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
-//use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+/**
+ * Class LocationAwareParameterBag is a custom parameter bag which is designed to keep track of the resources being
+ * loaded into the container and this bag. It is reliant on information it receives from other classes of the load
+ * process higher up in the chain to keep its path information up to date.
+ *
+ * @package CJW\CJWConfigProcessor\src\LocationAwareConfigLoadBundle
+ */
class LocationAwareParameterBag extends EnvPlaceholderParameterBag
{
- /** @var string Stores the current location that is being loaded */
+ /**
+ * @var string Stores the current location that is being loaded.
+ */
private $currentLocation;
public function __construct(array $parameters = [])
@@ -29,7 +37,8 @@ public function __construct(array $parameters = [])
*
* @param string $location The path / file that is being loaded.
*/
- public function setCurrentLocation(string $location) {
+ public function setCurrentLocation(string $location): void
+ {
$this->currentLocation = $location;
}
@@ -42,7 +51,7 @@ public function setCurrentLocation(string $location) {
* @param string $name The name of the parameter.
* @param mixed $value The value being set to the parameter.
*/
- public function set(string $name, $value)
+ public function set(string $name, $value): void
{
// Give the parameter, the value and the current location
CustomValueStorage::addParameterOrLocation($name,$value,$this->currentLocation);
diff --git a/src/LocationAwareConfigLoadBundle/LocationRetrievalCoordinator.php b/src/LocationAwareConfigLoadBundle/LocationRetrievalCoordinator.php
index c941135..a7da293 100644
--- a/src/LocationAwareConfigLoadBundle/LocationRetrievalCoordinator.php
+++ b/src/LocationAwareConfigLoadBundle/LocationRetrievalCoordinator.php
@@ -9,26 +9,42 @@
use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Contracts\Cache\ItemInterface;
+/**
+ * Class LocationRetrievalCoordinator is the instigator of the entire location retrieval process and responsible for
+ * creating and using both the custom kernel and helper classes to determine, keep track of and store the locations
+ * of and for every determined parameter.
+ *
+ * @package CJW\CJWConfigProcessor\src\LocationAwareConfigLoadBundle
+ */
class LocationRetrievalCoordinator
{
- /** @var LoadInitializer A custom kernel that initiates the entire custom loading process. */
+ /**
+ * @var LoadInitializer A custom kernel that initiates the entire custom loading process.
+ */
private static $customConfigLoader;
- /** @var array An array which not only stores the parameters, but also the paths they have been read from (including the values set there) */
+ /**
+ * @var array An array which not only stores the parameters, but also the paths they have been read from (including the values set there)
+ */
public static $parametersAndLocations;
- /** @var PhpFilesAdapter A cache which is supposed to store the parameters that have been parsed. */
+ /**
+ * @var PhpFilesAdapter A cache which is supposed to store the parameters that have been parsed.
+ */
private static $cache;
- /** @var bool */
+ /**
+ * @var bool
+ */
private static $initialized = false;
/**
* "Initiates" the class and sets all missing and non-instantiated attributes of the class prior to the rest
* of its functions being called.
*/
- public static function initializeCoordinator(): void {
+ public static function initializeCoordinator(): void
+ {
if (!self::$customConfigLoader) {
self::$customConfigLoader = new LoadInitializer($_SERVER["APP_ENV"], (bool)$_SERVER["APP_DEBUG"]);
}
@@ -51,10 +67,8 @@ public static function initializeCoordinator(): void {
try {
// If parameters are returned (meaning that the kernel has booted and thus new parameters could have entered), delete the parameters present
// also delete the processed parameters based on the previous parameters
- if (
- is_array(self::$parametersAndLocations) &&
- count(self::$parametersAndLocations) > 0
- ) {
+ if (is_array(self::$parametersAndLocations) && count(self::$parametersAndLocations) > 0)
+ {
self::$cache->delete("cjw_parameters_and_locations");
self::$cache->delete("cjw_processed_param_objects");
self::$cache->delete("cjw_processed_params");
@@ -75,7 +89,9 @@ public static function initializeCoordinator(): void {
}
/**
- * @return array
+ * Retrieves all parameters and the associated locations which have been retrieved by the class.
+ *
+ * @return array An associative array, which contains the parameters as first keys, then the different paths and the values that have been set in those files.
*/
public static function getParametersAndLocations(): array
{
@@ -86,11 +102,19 @@ public static function getParametersAndLocations(): array
return self::$parametersAndLocations;
}
- public static function getParameterLocations (
- string $parameterName,
- array $siteAccessGroups = null,
- bool $withSiteAccess = false
- ) {
+ /**
+ * This functionality allows to retrieve all locations specific to one parameter given to the function. This can
+ * be done in a site access context too, where all site access versions of the given parameter will be looked at
+ * as well.
+ *
+ * @param string $parameterName The name of the parameter who's locations should be retrieved.
+ * @param array|null $siteAccessGroups An array of the site access groups that exist in the current installation (required to determine site access groups versions of the parameter).
+ * @param bool $withSiteAccess A boolean which states whether the parameter should be viewed in a site access context. Set to true, all site access versions of the given parameter are looked at.
+ *
+ * @return array|null An array of locations for the parameter of null if nothing could be found.
+ */
+ public static function getParameterLocations (string $parameterName, array $siteAccessGroups = null, bool $withSiteAccess = false): ?array
+ {
if (!self::$initialized) {
self::initializeCoordinator();
}
@@ -102,16 +126,14 @@ public static function getParameterLocations (
* Returns the internal array which keeps track of all encountered locations without any connection to
* the parameters, values or other information. It resembles a plain "stack" of locations.
*
- * @param string $parameterName
- * @param array|null $siteAccessGroups
- * @param bool $withSiteAccess
+ * @param string $parameterName The name of the parameter who's locations should be retrieved.
+ * @param array|null $siteAccessGroups An array of the site access groups that exist in the current installation (required to determine site access groups versions of the parameter).
+ * @param bool $withSiteAccess A boolean which states whether the parameter should be viewed in a site access context. Set to true, all site access versions of the given parameter are looked at.
+ *
* @return array Returns an array which is filled with all encountered locations during the configuration-loading-process.
*/
- private static function getLocationsForSpecificParameter (
- string $parameterName,
- array $siteAccessGroups = null,
- bool $withSiteAccess = false
- ) {
+ private static function getLocationsForSpecificParameter (string $parameterName, array $siteAccessGroups = null, bool $withSiteAccess = false): ?array
+ {
$parameterKeySegments = explode(".", $parameterName);
if (is_array($parameterKeySegments) && count($parameterKeySegments) > 1) {
@@ -187,10 +209,18 @@ private static function getLocationsForSpecificParameter (
}
}
- private static function getLocationsFromRewrittenSiteAccessParameter(
- string $newSiteAccess,
- array $originalParameterKeySegments
- ) {
+ /**
+ * This function takes the original parameter name which has been split up by the "." (dots) and a given site access
+ * by which to look at it and creates a new parameter name through the given parts. Afterwards it checks for whether
+ * locations exist for that specific parameter.
+ *
+ * @param string $newSiteAccess The site access with which to construct the parameter name.
+ * @param array $originalParameterKeySegments An array of all segments of the parameter key.
+ *
+ * @return array Returns an array which includes the found locations for the new parameter or an empty one if nothing could be found.
+ */
+ private static function getLocationsFromRewrittenSiteAccessParameter(string $newSiteAccess, array $originalParameterKeySegments): array
+ {
if ($originalParameterKeySegments[1] !== $newSiteAccess) {
$originalParameterKeySegments[1] = $newSiteAccess;
diff --git a/src/Utility/Utility.php b/src/Utility/Utility.php
index 1ce3c6b..5733b00 100644
--- a/src/Utility/Utility.php
+++ b/src/Utility/Utility.php
@@ -6,14 +6,30 @@
use Exception;
+/**
+ * Class Utility is, as the name implies, a class which is responsible for delivering utility functionality that can
+ * be employed (mostly without any conditions) in other classes.
+ *
+ * @package CJW\CJWConfigProcessor\src\Utility
+ */
class Utility
{
- public static function removeUncommonParameters (
- array $firstParameterList,
- array $secondParameterList,
- int $level = 0
- ) {
+ /**
+ * Responsible for removing uncommon parameters between two given hierarchical, associative arrays of parameters.
+ * It is designed to work with site access versions of the parameters, which means that the parameters typically
+ * don't go deeper then two levels.
+ *
+ * @param array $firstParameterList The first list of parameters to check against the second.
+ * @param array $secondParameterList The second list of parameters to check against the first.
+ * @param int $level The (optional) amount of levels the comparison has gone to in the two arrays.
+ *
+ * @return array[] A multi dimensional array, which contains the first and second parameter lists with only the common parameters.
+ *
+ * @see removeCommonParameters For a similar function which does the opposite.
+ */
+ public static function removeUncommonParameters (array $firstParameterList, array $secondParameterList, int $level = 0): array
+ {
$firstListKeys = array_keys($firstParameterList);
$secondListKeys = array_keys($secondParameterList);
@@ -48,11 +64,21 @@ public static function removeUncommonParameters (
return [$firstParameterList,$secondParameterList];
}
- public static function removeCommonParameters (
- array $firstParameterList,
- array $secondParameterList,
- int $level = 0
- ) {
+ /**
+ * Responsible for removing common parameters between two given hierarchical, associative arrays of parameters.
+ * It is designed to work with site access versions of the parameters, which means that the parameters typically
+ * don't go deeper then two levels.
+ *
+ * @param array $firstParameterList The first list of parameters to check against the second.
+ * @param array $secondParameterList The second list of parameters to check against the first.
+ * @param int $level The (optional) amount of levels the comparison has gone to in the two arrays.
+ *
+ * @return array[] A multi dimensional array, which contains the first and second parameter lists with only the uncommon parameters.
+ *
+ * @see removeUncommonParameters For a similar function which does the opposite.
+ */
+ public static function removeCommonParameters (array $firstParameterList, array $secondParameterList, int $level = 0): array
+ {
$firstListKeys = array_keys($firstParameterList);
$secondListKeys = array_keys($secondParameterList);
@@ -87,12 +113,15 @@ public static function removeCommonParameters (
/**
* Taken off StackOverflow from
+ *
* @author Captain kurO
* @url https://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential/4254008#4254008
+ *
* @param array $array
+ *
* @return bool
*/
- public static function has_string_keys(array $array)
+ public static function has_string_keys(array $array): bool
{
return count(
array_filter(
@@ -102,9 +131,16 @@ public static function has_string_keys(array $array)
) > 0;
}
- public static function determinePureSiteAccesses(
- array $processedParameterArray
- ): array {
+ /**
+ * Determines and then returns the defined "pure" site accesses of your installation through a given list of the
+ * application configuration. Pure in this case means, that site access groups are not included in that list.
+ *
+ * @param array $processedParameterArray An associative, hierarchical array of parameters to search for the site accesses.
+ *
+ * @return string[] Returns an array of site accesses in the form of strings.
+ */
+ public static function determinePureSiteAccesses(array $processedParameterArray): array
+ {
try {
$results =
$processedParameterArray["ezpublish"]["siteaccess"]["list"]["parameter_value"];
@@ -116,9 +152,16 @@ public static function determinePureSiteAccesses(
}
}
- public static function determinePureSiteAccessGroups (
- array $processedParameterArray
- ): array {
+ /**
+ * Determines and then returns the defined site access groups of your installation through a given list of the
+ * application configuration. Pure in this case means, that the site accesses are not included in that list.
+ *
+ * @param array $processedParameterArray An associative, hierarchical array of parameters to search for the site accesses.
+ *
+ * @return array Returns an array of the found site access groups (empty if non are found).
+ */
+ public static function determinePureSiteAccessGroups (array $processedParameterArray): array
+ {
try {
return $processedParameterArray["ezpublish"]["siteaccess"]["groups"]["parameter_value"];
} catch (Exception $error) {
@@ -126,10 +169,20 @@ public static function determinePureSiteAccessGroups (
}
}
- public static function removeEntryThroughKeyList (
- array $parameters,
- array $keyList
- ): array {
+ /**
+ * Takes a given list of hierarchical key segments and also an associative array of parameters and aims to delete
+ * the key at the very bottom of the key list from the parameters array.
+ *
+ *
For example: Giving only one key segment / key in the list will remove that key from the very first level of
+ * the associative parameters array.
+ *
+ * @param array $parameters An associative array of parameters from which to delete the given key.
+ * @param array $keyList A list of keys that will be gone through to the very last given segment, which is then going to be deleted from the given parameters array.
+ *
+ * @return array Returns the remaining array of parameters, after the key segment has been deleted.
+ */
+ public static function removeEntryThroughKeyList (array $parameters, array $keyList): array
+ {
$key = reset($keyList);
array_splice($keyList,0,1);
@@ -150,10 +203,19 @@ public static function removeEntryThroughKeyList (
return $parameters;
}
- public static function removeSpecificKeySegment (
- string $keySegment,
- array $parametersToRemoveFrom
- ) {
+ /**
+ * Similar to {@see removeEntryThroughKeyList}, aims to remove a specific key from an associative array of parameters.
+ * In contrast to the above mentioned function, this one takes only one specific key and goes through the entire
+ * array until the key is found, while the other function goes through the given list of segments and only these
+ * segments and then deletes the key if it exists.
+ *
+ * @param string $keySegment The specific key to be removed from the given array.
+ * @param array $parametersToRemoveFrom An associative array of parameters from which to remove the given key, if it exists.
+ *
+ * @return array Returns the resulting array of parameters, after the key segment has been deleted (unchanged from the given array, if the key could not be found).
+ */
+ public static function removeSpecificKeySegment (string $keySegment, array $parametersToRemoveFrom): array
+ {
$result = $parametersToRemoveFrom;
foreach ($parametersToRemoveFrom as $key => $value) {