刚上手thinkphp5项目,原始项目所有配置都写在了config.php主配置文件中,包括项目主配置、业务配置和运维相关配置。这样会存在一个问题(),运维部署项目的时候一般会单独保存生产环境中账号密码等配置,并不关心项目配置和业务配置。配置文件只有一个的情况下,不可避免,每次上线增加或减少的配置都要通知运维更新,这种耦合在一起的情况不可取。
于是就把运维相关配置都写在了.env文件中,在config.php文件中使用自定义env辅助函数加载env配置。但是问题来了,启动时一直报env未定义错误。
写env辅助函数还是从Laravel学来的,在tp里报错有点百思不得其解。看了tp框架启动源码后发现是这么回事,tp启动一开始首先是加载config配置文件然后才是加载扩展函数,所以include配置的时候自然而然报未定义错误。
Laravel为什么不报错?看了Laravel启动过程和加载.env过程明白过来。Laravel启动之初首先用env()检查环境变量,如果没有会使用vlucas/phpdotenv库加载.env文件,而tp并没有这一步,所以写在配置文件中的env函数不可用,所以就报错了。
没办法,只能使用php自带的getenv了。
回头又看了一下dotenv源码,工厂函数实例化了三个adapters(new EnvConstAdapter, new PutenvAdapter, new ServerConstAdapter),读取到env值后分别写到了$_ENV、$_SERVER、putenv中了,而tp只用了一种(putenv)方式保存.env的值。
从加载环境变量这个点上就能看出Laravel和tp的特点了:
Laravel:优雅、全面、上手快;对应的缺点就是东西多、重、效率不高。
tp:实用主义、简单、小而快。