我正在使用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值转义?
由于Drupal函数的工作方式,似乎不可能。
使用drupal_rewrite_settings
函数,我们可以将设置的值添加为字符串,如下所示:
$settings['settings']['trusted_host_patterns'] = (object) [
'value' => "FUNC[explode(',', '^'.getenv('SITE_URL').'$')]",
'required' => TRUE,
];
然后,我们可以直接在"FUNC[***]"
文件中用***
替换所有出现的settings.php
。
将所有设置放在一个单独的文件中。此处的示例为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
转储新文件要好得多,但是它并非不幸地工作。