Move path determination logic into the `ConfigFactory`

This commit is contained in:
Philipp Holzer 2021-09-12 13:44:29 +02:00
parent 5702944116
commit 27e4586597
Signed by: nupplaPhil
GPG Key ID: 24A7501396EB5432
10 changed files with 114 additions and 55 deletions

View File

@ -25,6 +25,7 @@ use Exception;
use Friendica\App\Arguments; use Friendica\App\Arguments;
use Friendica\App\BaseURL; use Friendica\App\BaseURL;
use Friendica\App\Module; use Friendica\App\Module;
use Friendica\Factory\ConfigFactory;
use Friendica\Module\Maintenance; use Friendica\Module\Maintenance;
use Friendica\Security\Authentication; use Friendica\Security\Authentication;
use Friendica\Core\Config\Cache; use Friendica\Core\Config\Cache;
@ -352,7 +353,7 @@ class App
$this->profiler->update($this->config); $this->profiler->update($this->config);
Core\Hook::loadHooks(); Core\Hook::loadHooks();
$loader = new ConfigFileLoader($this->getBasePath(), $_SERVER); $loader = (new ConfigFactory())->createConfigFileLoader($this->getBasePath(), $_SERVER);
Core\Hook::callAll('load_config', $loader); Core\Hook::callAll('load_config', $loader);
} }

View File

@ -30,6 +30,45 @@ use Friendica\Util\ConfigFileLoader;
class ConfigFactory class ConfigFactory
{ {
/**
* The key of the $_SERVER variable to override the config directory
*
* @var string
*/
const CONFIG_DIR_ENV = 'FRIENDICA_CONFIG_DIR';
/**
* The Sub directory of the config-files
*
* @var string
*/
const CONFIG_DIR = 'config';
/**
* The Sub directory of the static config-files
*
* @var string
*/
const STATIC_DIR = 'static';
/**
* @param string $basePath The basepath of FRIENDICA
* @param array $serer the $_SERVER array
*
* @return ConfigFileLoader
*/
public function createConfigFileLoader(string $basePath, array $server = [])
{
if (!empty($server[self::CONFIG_DIR_ENV]) && is_dir($server[self::CONFIG_DIR_ENV])) {
$configDir = $server[self::CONFIG_DIR_ENV];
} else {
$configDir = $basePath . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
}
$staticDir = $basePath . DIRECTORY_SEPARATOR . self::STATIC_DIR;
return new ConfigFileLoader($basePath, $configDir, $staticDir);
}
/** /**
* @param ConfigFileLoader $loader The Config Cache loader (INI/config/.htconfig) * @param ConfigFileLoader $loader The Config Cache loader (INI/config/.htconfig)
* *

View File

@ -29,6 +29,7 @@ use Friendica\Core\Update;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
use Friendica\DI; use Friendica\DI;
use Friendica\Factory\ConfigFactory;
use Friendica\Model\Register; use Friendica\Model\Register;
use Friendica\Module\BaseAdmin; use Friendica\Module\BaseAdmin;
use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\InternalServerErrorException;
@ -151,7 +152,7 @@ class Summary extends BaseAdmin
} }
// check legacy basepath settings // check legacy basepath settings
$configLoader = new ConfigFileLoader($a->getBasePath(), $_SERVER); $configLoader = (new ConfigFactory())->createConfigFileLoader($a->getBasePath(), $_SERVER);
$configCache = new Cache(); $configCache = new Cache();
$configLoader->setupCache($configCache); $configLoader->setupCache($configCache);
$confBasepath = $configCache->get('system', 'basepath'); $confBasepath = $configCache->get('system', 'basepath');

View File

@ -35,27 +35,6 @@ use Friendica\Core\Config\Cache;
*/ */
class ConfigFileLoader class ConfigFileLoader
{ {
/**
* The key of the $_SERVER variable to override the config directory
*
* @var string
*/
const CONFIG_DIR_ENV = 'FRIENDICA_CONFIG_DIR';
/**
* The Sub directory of the config-files
*
* @var string
*/
const CONFIG_DIR = 'config';
/**
* The Sub directory of the static config-files
*
* @var string
*/
const STATIC_DIR = 'static';
/** /**
* The default name of the user defined ini file * The default name of the user defined ini file
* *
@ -90,15 +69,16 @@ class ConfigFileLoader
*/ */
private $staticDir; private $staticDir;
public function __construct(string $basePath, array $server) /**
* @param string $baseDir The base
* @param string $configDir
* @param string $staticDir
*/
public function __construct(string $baseDir, string $configDir, string $staticDir)
{ {
$this->baseDir = $basePath; $this->baseDir = $baseDir;
if (!empty($server[self::CONFIG_DIR_ENV]) && is_dir($server[self::CONFIG_DIR_ENV])) { $this->configDir = $configDir;
$this->configDir = $server[self::CONFIG_DIR_ENV]; $this->staticDir = $staticDir;
} else {
$this->configDir = $this->baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
}
$this->staticDir = $this->baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR;
} }
/** /**
@ -113,7 +93,7 @@ class ConfigFileLoader
* *
* @throws Exception * @throws Exception
*/ */
public function setupCache(Cache $config, array $server = [], $raw = false) public function setupCache(Cache $config, array $server = [], bool $raw = false)
{ {
// Load static config files first, the order is important // Load static config files first, the order is important
$config->load($this->loadStaticConfig('defaults'), Cache::SOURCE_FILE); $config->load($this->loadStaticConfig('defaults'), Cache::SOURCE_FILE);
@ -196,7 +176,7 @@ class ConfigFileLoader
$filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/ $filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
Addon::DIRECTORY . DIRECTORY_SEPARATOR . // addon/ Addon::DIRECTORY . DIRECTORY_SEPARATOR . // addon/
$name . DIRECTORY_SEPARATOR . // openstreetmap/ $name . DIRECTORY_SEPARATOR . // openstreetmap/
self::CONFIG_DIR . DIRECTORY_SEPARATOR . // config/ 'config'. DIRECTORY_SEPARATOR . // config/
$name . ".config.php"; // openstreetmap.config.php $name . ".config.php"; // openstreetmap.config.php
if (file_exists($filepath)) { if (file_exists($filepath)) {
@ -217,9 +197,8 @@ class ConfigFileLoader
*/ */
public function loadEnvConfig(array $server) public function loadEnvConfig(array $server)
{ {
$filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/ $filepath = $this->staticDir . DIRECTORY_SEPARATOR . // /var/www/html/static/
self::STATIC_DIR . DIRECTORY_SEPARATOR . // static/ "env.config.php"; // env.config.php
"env.config.php"; // env.config.php
if (!file_exists($filepath)) { if (!file_exists($filepath)) {
return []; return [];

View File

@ -74,10 +74,12 @@ return [
] ]
], ],
Util\ConfigFileLoader::class => [ Util\ConfigFileLoader::class => [
'shared' => true, 'instanceOf' => Factory\ConfigFactory::class,
'constructParams' => [ 'call' => [
[Dice::INSTANCE => '$basepath'], ['createConfigFileLoader', [
$_SERVER, [Dice::INSTANCE => '$basepath'],
$_SERVER,
], Dice::CHAIN_CALL],
], ],
], ],
Config\Cache::class => [ Config\Cache::class => [

View File

@ -55,7 +55,7 @@ class DatabaseCacheTest extends CacheTest
// load real config to avoid mocking every config-entry which is related to the Database class // load real config to avoid mocking every config-entry which is related to the Database class
$configFactory = new ConfigFactory(); $configFactory = new ConfigFactory();
$loader = new ConfigFileLoader($this->root->url(), []); $loader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), []);
$configCache = $configFactory->createCache($loader); $configCache = $configFactory->createCache($loader);
$dba = new StaticDatabase($configCache, $profiler, $logger); $dba = new StaticDatabase($configCache, $profiler, $logger);

View File

@ -57,7 +57,7 @@ class DatabaseLockDriverTest extends LockTest
// load real config to avoid mocking every config-entry which is related to the Database class // load real config to avoid mocking every config-entry which is related to the Database class
$configFactory = new ConfigFactory(); $configFactory = new ConfigFactory();
$loader = new ConfigFileLoader($this->root->url(), []); $loader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), []);
$configCache = $configFactory->createCache($loader); $configCache = $configFactory->createCache($loader);
$dba = new StaticDatabase($configCache, $profiler, $logger); $dba = new StaticDatabase($configCache, $profiler, $logger);

View File

@ -33,7 +33,7 @@ class ProcessTest extends DatabaseTest
// load real config to avoid mocking every config-entry which is related to the Database class // load real config to avoid mocking every config-entry which is related to the Database class
$configFactory = new ConfigFactory(); $configFactory = new ConfigFactory();
$loader = new ConfigFileLoader($this->root->url(), []); $loader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), []);
$configCache = $configFactory->createCache($loader); $configCache = $configFactory->createCache($loader);
$this->dba = new StaticDatabase($configCache, $profiler, $logger); $this->dba = new StaticDatabase($configCache, $profiler, $logger);

View File

@ -55,7 +55,7 @@ class DatabaseStorageTest extends StorageTest
// load real config to avoid mocking every config-entry which is related to the Database class // load real config to avoid mocking every config-entry which is related to the Database class
$configFactory = new ConfigFactory(); $configFactory = new ConfigFactory();
$loader = new ConfigFileLoader($this->root->url(), []); $loader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), []);
$configCache = $configFactory->createCache($loader); $configCache = $configFactory->createCache($loader);
$dba = new StaticDatabase($configCache, $profiler, $logger); $dba = new StaticDatabase($configCache, $profiler, $logger);

View File

@ -22,6 +22,7 @@
namespace Friendica\Test\src\Util\Config; namespace Friendica\Test\src\Util\Config;
use Friendica\Core\Config\Cache; use Friendica\Core\Config\Cache;
use Friendica\Factory\ConfigFactory;
use Friendica\Test\MockedTest; use Friendica\Test\MockedTest;
use Friendica\Test\Util\VFSTrait; use Friendica\Test\Util\VFSTrait;
use Friendica\Util\ConfigFileLoader; use Friendica\Util\ConfigFileLoader;
@ -45,7 +46,11 @@ class ConfigFileLoaderTest extends MockedTest
{ {
$this->delConfigFile('local.config.php'); $this->delConfigFile('local.config.php');
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -67,7 +72,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent('<?php return true;'); ->setContent('<?php return true;');
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -91,7 +100,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent(file_get_contents($file)); ->setContent(file_get_contents($file));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -123,7 +136,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent(file_get_contents($file)); ->setContent(file_get_contents($file));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -154,7 +171,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root) ->at($this->root)
->setContent(file_get_contents($file)); ->setContent(file_get_contents($file));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -203,7 +224,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('addon')->getChild('test')->getChild('config')) ->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
->setContent(file_get_contents($file)); ->setContent(file_get_contents($file));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$conf = $configFileLoader->loadAddonConfig('test'); $conf = $configFileLoader->loadAddonConfig('test');
@ -235,7 +260,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent(file_get_contents($fileDir . 'B.config.php')); ->setContent(file_get_contents($fileDir . 'B.config.php'));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -264,7 +293,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent(file_get_contents($fileDir . 'B.ini.php')); ->setContent(file_get_contents($fileDir . 'B.ini.php'));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -293,7 +326,11 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config')) ->at($this->root->getChild('config'))
->setContent(file_get_contents($fileDir . 'B.ini.php')); ->setContent(file_get_contents($fileDir . 'B.ini.php'));
$configFileLoader = new ConfigFileLoader($this->root->url(), []); $configFileLoader = new ConfigFileLoader(
$this->root->url(),
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::CONFIG_DIR,
$this->root->url() . DIRECTORY_SEPARATOR . ConfigFactory::STATIC_DIR
);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -309,7 +346,7 @@ class ConfigFileLoaderTest extends MockedTest
{ {
$this->delConfigFile('local.config.php'); $this->delConfigFile('local.config.php');
$configFileLoader = new ConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => '/a/wrong/dir/']); $configFileLoader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => '/a/wrong/dir/']);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);
@ -334,7 +371,7 @@ class ConfigFileLoaderTest extends MockedTest
->at($this->root->getChild('config2')) ->at($this->root->getChild('config2'))
->setContent(file_get_contents($fileDir . 'B.config.php')); ->setContent(file_get_contents($fileDir . 'B.config.php'));
$configFileLoader = new ConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => $this->root->getChild('config2')->url()]); $configFileLoader = (new ConfigFactory())->createConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => $this->root->getChild('config2')->url()]);
$configCache = new Cache(); $configCache = new Cache();
$configFileLoader->setupCache($configCache); $configFileLoader->setupCache($configCache);