1

想像できる限り多くのORMをすでに使用しています。現在、私はRedBeanPHPに夢中/嫌いです。ここに行きます...それを数時間研究した後、私はこの非常に基本的な問題を解決するためのより良い方法が何であるかについて疑問を抱きました(最良の方法は、この場合、RedBeanの使いやすさの哲学によりよく適合する方法を意味します):

クラスの一部のプロパティへのアクセスを制限して、特定の種類の誤ったデータ操作を防ぐことができるのは非常に一般的です。これは通常、ゲッターとセッターをうまく利用して実現されます。ただし、RedBeanについてすでに知っている限り、ネイティブクラスには正式なセッターはなく、データベースで変更および永続化できるパブリックプロパティのみがあります。

私がやりたいのは、いくつかのプロパティが手動で変更されないように保護することです。そうすれば、他のプログラマーが次のような奇妙なことをするのを避けることができます。

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

もちろん、そのフィールドは行の挿入後に変更されるべきではありませんが、誰も変更しないと信じることはできません。保護されたプロパティをinsertion_dateに変更したり、何らかの方法でアクセスできないようにするなどの方法はありますか?

そのための最善の方法は$beam->setMetadata()、特定のプロパティを変更してはならないことを宣言することだと思いますが、RedBeanでこれを実現する方法がわからず、公式マニュアルで十分な情報を見つけることができませんでした。どんな助けでも大歓迎です。

読んでくれてありがとう。

4

3 に答える 3

1

もう 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 に答える