首页 > 解决方案 > 如何根据数据库中的受控列表值正确管理 Web 应用程序行为?

问题描述

我不确定这是否是问这个问题的正确地方,所以请告知是否应该移动它。

我正在开发一个基于 Laravel 的 Web 应用程序,其主要目的是为特定的 MariaDB 关系数据库提供接口,我自己没有设计或开发该数据库。

该数据库包含许多所谓的词汇术语“受控列表”,其形式为具有自动增量字段和保存术语的字符串字段的表格。

这些表之一用于控制在数据库中创建或编辑记录时设置的可能状态。可供选择的术语(<select>在 HTML 表单中使用 a)包括draftcomplete等,并从表中检索。

问题如下:

该应用程序具有用户角色的基本系统,因为不同类型的用户应该具有不同的权限。

其中一个角色是读者,它只允许搜索和查看现有记录,而不能编辑任何内容。但是,此用户角色应该能够查看处于草稿状态的记录。

我目前管理这个的方式有点像这样:

if (Auth::user()->is_reader && $record->status === 1) {
    abort(403,'Not enough privileges to view this record.');
}

它基本上使用状态列表中草稿值的 ID 来检查记录的状态并采取相应的行动。我也在使用类似的系统从搜索结果中排除草稿记录。

我不喜欢这样,因为它依赖于数据库中的特定 ID 值,尽管 Web 界面无法更改此特定表(状态列表)中的值,但实际值仍可能更改(或不是?)。

我曾想过首先对表进行查询以获取术语所在的 ID LIKE %draft%,但是-尽管可能更合适-我认为我仍然会依赖某些将来可能会因某种原因而改变的东西(术语草稿)。另外,我怀疑它会对性能产生一些影响,尽管可能影响不大。

有什么更好的方法来解决这个问题?也许不要将数据库用于这个特定的术语列表并将它们放在配置文件中?

谢谢你的帮助。

标签: phpdatabaselaravelsoftware-design

解决方案


您可以使用一些常量创建一个抽象类,然后使用该 const 来引用所需的值。

就像是:

abstract class RecordStatus {
  // Some random names
  const STATUS_READABLE = 1;
  const STATUS_WRITABLE = 2;
}

然后当你需要使用它时:

if (Auth::user()->is_reader && $record->status === RecordStatus::STATUS_READABLE) {
    abort(403,'Not enough privileges to view this record.');
}

这样你就有:

  • IDE 自动完成和检查
  • 您可以轻松更改该值(例如,可读应该是 3 而不是 1?只需在抽象类中更改它)

推荐阅读