Сохраняем конфиг файлы (array_export)

Mex-Vision

Бессмертный
Iron Lord
Победитель в номинации 2022
Победитель в номинации 2021
Победитель в номинации 2020
Победитель в номинации 2019
Победитель в номинации 2017
Сообщения
833
Розыгрыши
0
Репутация
448
Реакции
544
Баллы
1 613
На днях было необходимо сохранять массивы в конфиг файлы, написал функцию для преобразования массива в строковое представление. Возможно кому-то будет нужно, оставлю тут.

PHP:
/**
 * Возвращает интерпретируемое строковое представление массива.
 * @param array $array Массив.
 * @param bool $beautify Форматировать ли возвращаемую строку.
 * @return string Интерпретируемое строковое представление массива.
 */

function array_export(array $array, bool $beautify, int $iteration = 0): string
{
   if(empty($array))
      return "[]";
   $tab = $beautify ? str_repeat("\t", $iteration) : "";
   $result = $beautify ? "[\n" : "[";
   $count = count($array);
   foreach ($array as $key => $val)
   {
      $count--;
      $result .= $beautify ? ($tab . "\t") : "";
      $result .= to_array_element($key);
      $result .= $beautify ? " => " : "=>";

      if(is_array($val))
         $result .= array_export($val, $beautify, $iteration + 1);
      else
         $result .= to_array_element($val);

      $result .= ($count > 0) ? "," : "";
      $result .= $beautify ? "\n" : "";
   }
   return $beautify ? $result . $tab . "]" : $result . "]";
}

function to_array_element($value) : string
{
   if(is_int($value) or is_float($value))
      return $value;
   if(is_bool($value))
      return var_export($value, true);
   if(is_null($value))
      return 'null';
   if(is_object($value))
      return get_class($value) . "::class";
   return '"' . ((string) $value) . '"';
}

Кормим массив, и получаем его строковое представление. В отличии от var_export использует синтаксис массивов PHP 5.4+ и поддерживает форматирование (табуляция, переносы строк и т.п.).

Как использовать?

PHP:
$config = [
    'config' => [
        'float' => 1.2,
        'string' => 'str',
        'bool' => true,
        'null' => null,
        'object' => new \mmopane\validate\Validator(),
    ]
];

file_put_contents("config.php", "<?php \n\nreturn " . array_export($config, true) . ";");

/* Содержимое файла config.php */

return [
    "config" => [
        "float" => 1.2,
        "string" => "str",
        "bool" => true,
        "null" => null,
        "object" => mmopane\validate\Validator::class
    ]
];
 

Оффтоп:
Почему не использовать yaml\yml файлы?)
 
Оффтоп:
Почему не использовать yaml\yml файлы?)
Они в браузере палятся. Понимаю что можно и нужно выносить за директорию веб сервера, но это донастройка и т.п. Можно и env использовать, да хоть xml, лишь бы выше точки входа.
 
Они в браузере палятся. Понимаю что можно и нужно выносить за директорию веб сервера, но это донастройка и т.п. Можно и env использовать, да хоть xml, лишь бы выше точки входа.
nginx можешь конфигурировать как тебе нравится, будет показывать только то что указано
А вообще по конфигу, в .env вынести основные настройки бд и прочего что необходимо для функционирования сайта, при инсталле cms их заполнять, остальной конфиг пользовательский хранить в бд, при первой загрузки дергать в синглтон и юзать его
 
nginx можешь конфигурировать как тебе нравится, будет показывать только то что указано
А вообще по конфигу, в .env вынести основные настройки бд и прочего что необходимо для функционирования сайта, при инсталле cms их заполнять, остальной конфиг пользовательский хранить в бд, при первой загрузки дергать в синглтон и юзать его
Можно и так=) Суть не в том как нужно и правильно делать. Я просто поделился огрызком кода, возможно кому-то пригодится)
 
  • Мне нравится
Реакции: kick
а чем использование функций serialize / unserialize не устроило?
 
Назад
Сверху Снизу