0

たとえば、フィールドを持ついくつかのモデルがnameありuidますが、一部のモデルにはありません。これらのフィールドを持つすべてのモデルで次のルールを使用する必要がありますが、次のコード ブロックを各モデルに追加したくありません。

public $validate = array(
    'name' => array(
        array(
            'rule' => array('between', 1, 25),
            'message' => 'Name must contain %d to %d characters',
            'required' => true
        ),
        array(
            'rule' => array('custom', AppModel::REGEX_NAME),
            'message' => 'Name contains invalid characters.'
        )
    ),
    'uid' => array(
        'rule' => 'uuid',
        'message' => 'uid is not valid.',
        'required' => true
    ), 
);

AppModelを設定してルールを追加することを検討しましたpublic $validate。これにより、次の問題が発生します。

  1. これらのフィールドを持たないモデルは常に検証に失敗します。これrequiredは が true であるためです。
  2. モデルに設定した場合public $validate、AppModel からルールを継承しません。

これはオンザフライで検証を追加することで処理できると確信していますが(私は AppModel で beforeValidate() を考えています)、他の人がこれをどのように処理しているか知りたいです。

誰かがより良い方法を知っていますか?

4

3 に答える 3

2

個人的には、各モデルの検証配列をコピーして貼り付けるだけです。

それがあなたのやりたいことではない場合は、extend AppModeltoのようなことをすることができますMyAppModel。MyAppModel set 内でpublic $validate = array(...)、これらの検証ルールを必要とするモデルの場合、クラス宣言MyAppModelの代わりに単純に拡張します。AppModel

問題 2 については、呼び出しparent::validateてその配列を取得し、さらにルールを追加する必要があります。私の最初の考えは、 に見つからない新しいルールの配列を作成しMyAppModel、それarray_mergeを使用することarray + parent::validateです。

于 2013-09-03T20:18:57.793 に答える
1

これは通常、検証配列をコピーして貼り付けるか、「通常の」検証ルールをベイク テンプレートに設定するだけで処理されます。そうすれば、各プロジェクトの開始時にデフォルトで存在します。

または、上記のコメントに従って、動作を使用できますが、個人的には、多くのモデルを持っていない限り、それはやり過ぎだと思います。

于 2013-08-30T17:07:31.043 に答える