1

已经使用了你能想象到的尽可能多的 ORM。目前,我对 RedBean PHP 爱不释手。我们开始吧......经过几个小时的研究,我怀疑解决这个非常基本的问题的更好方法是什么(在这种情况下,最好的方法意味着更适合 RedBean 的易用性理念的方法):

限制对类的某些属性的访问是很常见的,这样我们就可以防止某些类型的错误数据操作。这通常是通过充分利用 getter 和 setter 来实现的。但就 RedBean 的了解而言,原生类中没有正式的 setter,只有一些可以更改和持久化在数据库中的公共属性。

我想做的是保护一些属性不被手动更改,这样我就可以避免其他程序员做出任何奇怪的事情,比如:

$beam->insertion_date = 'yesterday';
R::store($beam);

显然,在插入行后该字段不应该更改,但我们不能相信没有人会这样做。有没有办法实现诸如将插入日期变成受保护的属性或以某种方式使其无法访问?

我有一种感觉,最好的方法是使用$beam->setMetadata()并声明不应更改给定属性,但我不知道如何在 RedBean 中实现这一点,并且在官方手册中仍然找不到足够的信息。任何帮助表示赞赏。

谢谢阅读。

4

3 回答 3

3

保护您的数据库免受未经授权或意外修改的唯一防弹方法是使用数据库的权限系统(GRANTREVOKE),通过使用具有特定权限的不同用户配置文件,直至列级别等。

也许不容易实现,但是通过在(定制的)代码中保留特权,总会有漏洞。

于 2011-09-21T10:49:02.490 回答
1

另一种方法是将列的数据类型设置为具有指定状态的类型。

例如,如果您将 varchar(255) 更改为 varchar(254),RedBeanPHP 将发现更改并保留该列,因为它现在是指定列,例如,对于 int,您可以使用 INT(10)。特殊类型永远不会被转换:ENUM/DATE 等。

于 2011-11-23T19:45:57.340 回答
0

找到了解决方案!

  1. 在您的模型上,每次从数据库加载 bean 时,将 bean 的状态存储在私有属性中。
  2. 在将内容放回数据库之前,测试不应该更改的值是否以编程方式更改。

    • 在积极的情况下,抛出异常或添加任何其他事件以警告程序员他们正在尝试更改可能错误的不应更改的字段。

这就是示例模型现在的样子:

class Model_book extends RedBean_SimpleModel{

    protected $before = false;

    public function open(){
        if($this->bean->id){
            $this->before = clone($this->bean);
        }
    }

    public function update(){
        if($this->bean->id){
            if($this->before->insertion_date != $this->bean->insertion_date){
                throw new exception ("The insertion_date can't be changed.");
            }
        }
    }
}

所以现在下面的代码会导致异常:

$beam->insertion_date = 'yesterday';
R::store($beam);

注意:使用 RedBean 的元信息 API 会是一个更好的解决方案,但是如果不在 RedBean 之上添加一个完整的验证层,那么(仅)添加这个验证标准是没有意义的。另一方面,如果在不久的将来将内置验证添加到 ORM 中,添加自定义完整验证将变得无用(我敢打赌它会发生),所以我暂时保留它。

希望有帮助。

于 2011-09-26T09:38:20.770 回答