Экранирование функции PHP как значения массива - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над начальным набором Drupal 8 с Composer, похожим на drupal-composer / drupal-project .

В моем постустановочном скрипте я хочу заново сгенерируйте settings.php файл с моими пользовательскими значениями. Я видел, что это можно сделать с помощью функции drupal_rewrite_settings .

Например, я переписываю значение config_sync_directory следующим образом:

require_once $drupalRoot . '/core/includes/bootstrap.inc';
require_once $drupalRoot . '/core/includes/install.inc';
new Settings([]);
$settings['settings']['config_sync_directory'] = (object) [
  'value' => '../config/sync',
  'required' => TRUE,
];
drupal_rewrite_settings($settings, $drupalRoot . '/sites/default/settings.php');

Проблема Я хочу, чтобы в моем проекте Drupal 8 был Dotenv, поэтому сопровождающим не нужно изменять settings.php, а только файл .env в папке root проекта. Чтобы это работало, мой settings.php должен выглядеть следующим образом:

$databases['default']['default'] = [
  'database' => getenv('MYSQL_DATABASE'),
  'driver' => 'mysql',
  'host' => getenv('MYSQL_HOSTNAME'),
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'password' => getenv('MYSQL_PASSWORD'),
  'port' => '',
  'prefix' => '',
  'username' => getenv('MYSQL_USER'),
];
$settings['trusted_host_patterns'] = explode(',', '^'.getenv('SITE_URL').'$');

Как видите, значения заменены функциями PHP, и я не вижу хорошего способа распечатать эти значения, до такой степени, что я даже не уверен, что это возможно.

Итак, мой вопрос: возможно ли избежать функции PHP в качестве значения Array при объявлении этой переменной?

1 Ответ

0 голосов
/ 19 февраля 2020

Похоже, это невозможно из-за того, как работает функция Drupal.

Решение 1 от @ misorude

Используя функцию drupal_rewrite_settings, мы можем добавить значение параметров в виде строки, например:

$settings['settings']['trusted_host_patterns'] = (object) [
  'value' => "FUNC[explode(',', '^'.getenv('SITE_URL').'$')]",
  'required' => TRUE,
];

И после этого мы можем заменить все вхождения "FUNC[***]" на *** непосредственно в файле settings.php.


Решение 2

Поместите все ваши настройки в отдельный файл. Например, файл custom.settings.php:

if (getenv('DEBUG') == 'true') {
  $settings['container_yamls'][] = DRUPAL_ROOT . '/sites/dev.services.yml';
  $config['system.performance']['css']['preprocess'] = FALSE;
  $config['system.performance']['js']['preprocess'] = FALSE;
}
$databases['default']['default'] = [
  'database' => getenv('MYSQL_DATABASE'),
  'driver' => 'mysql',
  'host' => getenv('MYSQL_HOSTNAME'),
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'password' => getenv('MYSQL_PASSWORD'),
  'port' => '',
  'prefix' => '',
  'username' => getenv('MYSQL_USER'),
];
$settings['trusted_host_patterns'] = explode(',', '^'.getenv('SITE_URL').'$');
$settings['file_private_path'] = 'sites/default/files/private';
$settings['config_sync_directory'] = '../config/sync';

Затем мы можем скопировать default.settings.php и добавить наши пользовательские настройки.

$fs = new Filesystem();
$settings_generated = $drupalRoot . '/sites/default/settings.php';
$settings_default = $drupalRoot . '/sites/default/default.settings.php';
$settings_custom = $drupalRoot . '/../includes/custom.settings.php';
$fs->remove($settings_generated);
$fs->dumpFile($settings_generated, file_get_contents($settings_default) . file_get_contents($settings_custom));

Также есть appendToFile метод, который выглядит намного лучше, чем создание нового файла с dumpFile, но, к сожалению, он не работает.

...