Организация конфигов в Craft CMS
26 мая 2018
Довольно интересно сделаны конфиги в Craft CMS. Если вдруг о ней не слышали, это одна из лучших коммерческих на Yii.
Выглядят они примерно так:
return [
'*' => [
'omitScriptNameInUrls' => true,
],
'example.test' => [
'devMode' => true,
],
'example.com' => [
'cooldownDuration' => 0,
]
);
Соответственно, *
применяется всегда, а специфичные для окружения уже мёржатся сверху. Имеет право на жизнь и работает предсказуемо.
Если вдруг захотите такое в Yii без Craft, сделать довольно несложно:
class Config
{
private $config;
private $environment;
public function __construct(array $config, $environment = null)
{
$this->config = $config;
$this->environment = $environment;
}
public static function fromFile($filename, $environment = null)
{
if (!file_exists($filename)) {
return new static([], $environment);
}
return new static(require $filename, $environment);
}
public function toArray()
{
// If it's not a multi-environment config, return the whole thing
if (!array_key_exists('*', $this->config)) {
return $this->config;
}
// If no environment was specified, just look in the '*' array
if ($this->environment === null) {
return $this->config['*'];
}
$mergedConfig = [];
foreach ($this->config as $environment => $environmentConfig) {
if ($environment === '*' || $this->environment === $environment) {
$mergedConfig = ArrayHelper::merge($mergedConfig, $environmentConfig);
}
}
return $mergedConfig;
}
}
Ну и в index.php
:
$config = Config::fromFile(__DIR__ . '/../config/web.php', 'myenvironemnt_please_replace_me')->toArray();
(new yii\web\Application($config)->run();
Комментарии RSS по email OK
Спасибо за информацию, интересно будет посмотреть.
Подход так себе по сравнению с env или отдельными файлами. Как быть с приватными данными для прода?
mz, если у кого-то есть доступ на чтение конфига, у него точно есть доступ на чтение переменных окружения.