php - 如何根据数据库中的受控列表值正确管理 Web 应用程序行为?
问题描述
我不确定这是否是问这个问题的正确地方,所以请告知是否应该移动它。
我正在开发一个基于 Laravel 的 Web 应用程序,其主要目的是为特定的 MariaDB 关系数据库提供接口,我自己没有设计或开发该数据库。
该数据库包含许多所谓的词汇术语“受控列表”,其形式为具有自动增量字段和保存术语的字符串字段的表格。
这些表之一用于控制在数据库中创建或编辑记录时设置的可能状态。可供选择的术语(<select>
在 HTML 表单中使用 a)包括draft、complete等,并从表中检索。
问题如下:
该应用程序具有用户角色的基本系统,因为不同类型的用户应该具有不同的权限。
其中一个角色是读者,它只允许搜索和查看现有记录,而不能编辑任何内容。但是,此用户角色不应该能够查看处于草稿状态的记录。
我目前管理这个的方式有点像这样:
if (Auth::user()->is_reader && $record->status === 1) {
abort(403,'Not enough privileges to view this record.');
}
它基本上使用状态列表中草稿值的 ID 来检查记录的状态并采取相应的行动。我也在使用类似的系统从搜索结果中排除草稿记录。
我不喜欢这样,因为它依赖于数据库中的特定 ID 值,尽管 Web 界面无法更改此特定表(状态列表)中的值,但实际值仍可能更改(或不是?)。
我曾想过首先对表进行查询以获取术语所在的 ID LIKE %draft%
,但是-尽管可能更合适-我认为我仍然会依赖某些将来可能会因某种原因而改变的东西(术语草稿)。另外,我怀疑它会对性能产生一些影响,尽管可能影响不大。
有什么更好的方法来解决这个问题?也许不要将数据库用于这个特定的术语列表并将它们放在配置文件中?
谢谢你的帮助。
解决方案
您可以使用一些常量创建一个抽象类,然后使用该 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?只需在抽象类中更改它)
推荐阅读
- c# - 从 Mastercard/VISA 借记卡/信用卡读取 EMV 数据
- android-studio - Gradle 同步失败并出现异常
- apl - 如何在 Dyalog APL 中使用 Rank 运算符构建自己的每个运算符
- java - Find user's member of groups in Microsoft AD inside Domain Users security group
- php - 将数据表单发送到数据库不起作用
- java - 模块化项目使用 jOpenDocument 上升 InvalidModuleDescriptorException
- java - 如何将图像 url 保存在 firebase 实时数据库中?
- dart - 飞镖:微型
- android - 使用导航组件时在片段之间传递数据有什么限制?
- javascript - 我想从mysql的connection.query中取出结果并将其保存在nodejs的全局范围链中