如何实现自托管本地设置文件与DDEV配置文件共存?
这个场景我太熟了!很多用DDEV搭建PHP项目的同学都会碰到这个冲突——自己的settings.php要读settings.local.php存自定义配置,DDEV又要生成同名文件放数据库凭据,两边抢同一个文件肯定出问题。下面给你几个经过实践验证的方案,按省心程度优先推荐:
方案1:调整DDEV生成的配置文件名(首推!)
DDEV其实完全支持自定义生成的本地配置文件名,根本不用死磕settings.local.php。你只需要打开项目根目录下的.ddev/config.yaml,加一行配置就行:
# 告诉DDEV把数据库凭据生成到local.settings.php里 settings_file: local.settings.php
改完之后,DDEV就会乖乖生成local.settings.php,而不是默认的settings.local.php。接下来你只需要调整自己settings.php里的加载顺序:先加载DDEV的数据库配置,再加载自己的settings.local.php——这样你的自定义配置还能覆盖DDEV的默认值,完美符合配置优先级的预期!
对应的settings.php代码可以这么写:
// 先加载DDEV自动生成的数据库凭据 if (file_exists(__DIR__ . '/local.settings.php')) { include __DIR__ . '/local.settings.php'; } // 再加载自己的本地自定义配置,优先级更高 if (file_exists(__DIR__ . '/settings.local.php')) { include __DIR__ . '/settings.local.php'; }
方案2:调整自己的自定义配置文件名
如果不想动DDEV的配置,那也可以反过来——把你自己的自定义配置文件改成local.settings.php,然后调整settings.php的加载顺序:先读DDEV生成的settings.local.php,再读自己的local.settings.php。不过这种方案需要你把原来的settings.local.php重命名,还要记得把local.settings.php加入.gitignore(毕竟是本地配置,不能提交到仓库)。
方案3:环境判断加载(不推荐,太折腾)
也可以在settings.php里加环境判断:如果当前是DDEV环境,就读DDEV的settings.local.php;否则读自己的。比如通过检测$_SERVER['DDEV_SITE']这个环境变量来判断:
if (getenv('DDEV_SITE')) { // DDEV环境,加载DDEV生成的配置 if (file_exists(__DIR__ . '/settings.local.php')) { include __DIR__ . '/settings.local.php'; } } else { // 非DDEV环境,加载自己的本地配置 if (file_exists(__DIR__ . '/settings.local.php')) { include __DIR__ . '/settings.local.php'; } }
但这种方案其实没必要,因为前面两种方案更简单直接,而且环境判断多了后期维护容易出问题,所以不优先推荐。
最省心的肯定是方案1,只需要改一行DDEV配置,调整下settings.php的加载顺序,就能让两边的文件和平共处,还能保证自定义配置的优先级。完全不用纠结文件名冲突的问题,亲测好用!
内容的提问来源于stack exchange,提问作者wizonesolutions

