无需复杂代码即可实现管理员可编辑的设置

应用面临着一个持续存在的问题。有些设置应该放在 .env 文件中,而另一些设置则必须能够通过管理面板进行更改,而无需重新部署代码。例如站点名称、时区或注册设置。

许多开发者将这些设置存储在数据库中,但却造成了混乱。最终你会拥有两种读取数据的方式:应用的一部分使用 config(),而另一部分则使用数据库模型。这会导致设置不一致从而引发 Bug。

你可以通过使用单一的读取路径来避免这个问题。将数据库视为在启动时覆盖配置的一个层。

以下是构建方法:

• 使用单一事实来源。数据库保存值,但应用程序仅通过 config() 进行读取。 • 使用类型化类。不要使用松散的数组,而是使用具有严格类型的类。这可以防止拼写错误和静默错误。 • 在启动过程中加载设置。使用服务提供程序(service provider)提取数据库值并将其推送到 config 数组中。

注意这两个技术陷阱:

  1. 时区陷阱 Laravel 在启动过程的早期设置时区。如果你稍后更改了配置值,PHP 仍会使用旧的时区。你必须手动调用 date_default_timezone_set(),以使全局 PHP 设置与你的新配置值同步。

  2. 新安装陷阱 新应用没有数据库表。如果因为缺少设置表而导致启动过程失败,应用将无法启动。如果应用无法启动,你就无法运行迁移(migrations)。请将你的设置逻辑包装在 try/catch 块中。这允许应用在运行迁移之前回退到 .env 默认值。

另一个安全方面的建议: 在禁用注册等功能时,不要只是在 UI 中隐藏按钮。要从配置中完全移除该功能。如果你从配置中移除了该功能,路由也会随之消失。一个带有活跃端点的隐藏表单是一个安全风险,而缺失的路由则会返回 404。

保持代码简洁。你的控制器(controllers)和视图(views)不应该知道设置是来自文件还是数据库。它们应该只看到 config()

来源:https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0