yii2 - Yii2 中所有项目的默认 main.php 配置文件

标签 yii2 yii2-advanced-app

我正在开发基于 Yii2 框架的多个网站,我想知道是否有任何好的方法,或者创建共享的基本配置是否是个好主意 main.php文件。

这背后的原因是我所有的项目都基于相同的系统,有很多相似之处,我只是想保持干燥。配置也基本相同 - 实际上唯一的区别是数据库名称和其他一些值。甚至 urlManager 规则也没有那么不同。

问题是,例如,当我想添加额外的 FileTarget要记录所有网站的目标,我必须分别为每个项目执行此操作,而且我永远无法确定所有项目配置是否都是最新的并且是否已正确设置所有内容。

所以我想知道是否有任何 Yii 方法可以创建在多个项目中共享的默认配置文件,或者这只是一个坏主意。例如,我可以创 build 置默认值的引导组件,或者将默认配置添加为 frontend\web\index.php 中合并配置列表中的第一项。文件。我在 Composer 中添加了私有(private)包,因此添加将在所有项目中共享的文件不是问题。

最佳答案

我在同一个问题上工作了很长时间,并尝试了几个想法。

目前,我已经为您描述的问题开​​发了很好的解决方案。
解决方案的核心是 hiqdev/composer-config-plugin - 合并来自扩展的配置的 Composer 插件。

例如,我们有一个扩展是我们所有 Web 项目的基础 hiqdev/hisite-core它包含基本的 Yii 应用程序 configparams :

return [
    'id' => 'hisite',
    'name' => 'HiSite',
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        ...

这些配置在 composer.json 中启用有这样的行:
"extra": {
    "config-plugin": {
        "params": "src/config/params.php",
        "hisite": "src/config/hisite.php"
    }
},

就是这样。您需要 hiqdev/hisite-core 并且在运行 composer update 之后,您已经在 vendor/hiqdev/config/hisite.php 中组装了配置(您可能有多个配置)

然后你从你的 index.php 中使用它,如下所示:
$config = require dirname(dirname(__DIR__)) . '/hiqdev/config/hisite.php';

您可以使用 Yii 扩展引导实现类似的行为,但引导必须在每个页面请求上运行。

该解决方案的美妙之处在于,您可以拥有许多组件,每个组件都提供自己的配置部分,并且它可以在不减慢页面渲染时间的情况下工作,因为配置在 composer install/update 时合并一次。 (并且您可以使用 composer dump-autoload 强制合并配置,不要忘记在更改配置后运行它)。

使用这种技术,我们创建了自动插件扩展:不需要在主配置中配置的主题、模块等 - 你只需要在 composer.json 中使用它们就可以了。

这个解决方案仍在进行中,它会发展和改变,但我们将它用于具有 30 多个扩展的非常大的基于 Yii2 的应用程序,并且它已经过测试并且足够稳定。

关于yii2 - Yii2 中所有项目的默认 main.php 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39145190/

相关文章:

javascript - Yii2:导航到表单中的另一个选项卡时自动保存表单

php - 在 ubuntu 中安装 Yii2 高级模板

php - Yii2 根据模型要求设置数组表单字段

使用 Nginx 的 Php - 403 禁止访问

jquery - yii2 将两个变量传递给 onchange

postgresql - 如何在 Yii2 中使用新创建的自定义 Postgres 模式类型(ENUM)

php - 过滤yii2产生错误Call to a member function isAttributeRequired() on null

php - Yii2错误: The view file does not exist

validation - Yii2 自定义验证器未按指南建议工作

yii2: 在 denyCallback 中调用未定义的方法 Closure::allows()