将PHP函数作为数组值转义

问题描述 投票:0回答:1

我正在使用Composer开发Drupal 8入门套件,类似于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文件。为了使其正常工作,我的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值转义?

php drupal-8 dotenv
1个回答
0
投票

由于Drupal函数的工作方式,似乎不可能。

@misorude的解决方案1

使用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转储新文件要好得多,但是它并非不幸地工作。

© www.soinside.com 2019 - 2024. All rights reserved.