0

CakePHP2 で最初のプロジェクトを作成しようとしています (以前は CakePHP1 を使用していました)。次の問題があります。

フィールド (個人の数値コード) のカスタム検証ルールを必要とするモデルがいくつかあります。検証ルールは非常に大きいため、各モデルでコードを繰り返したくありません。

代わりに、文字列をパラメーターとして受け取って検証する関数を含むコンポーネントを作成し、各モデルからその特定の関数を呼び出すことを考えました。

コンポーネントはコントローラーで使用する必要があると読んだので、これが最善の方法ではないでしょうか?

私がやろうとしているのは、実際に ModelValidator を拡張して独自のカスタム ルールを追加することですが、それが可能かどうかはわかりません。

助けてくれてありがとう。

4

2 に答える 2

0

いいえ、コンポーネントはモデル用ではありません。カスタム検証ルールに対して行うことは、AppModel にメソッドを追加することです。次に、モデルの任意の検証配列でそれらを使用できます。

カスタム検証メソッドの使用方法がわからない場合は、Cake book のセクションを参照してください。

http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods

ただし、必要な各モデルにメソッドを配置する代わりに、代わりに AppModel に配置します (AppModel クラスがない場合は、以下のように作成して に保存しapp/Model/AppModel.phpます。すべてのモデルはこのクラスを継承するため、カスタム検証メソッドは、どのモデルでも使用できます。)

簡単な例を次に示します。

/**
 * app/Model/AppModel.php
 */
class AppModel extends Model {

    /**
     * Validation rule for integers
     *
     * @param  mixed $value
     * @return bool
     */
    public function validateInteger($value) {
        return preg_match('/^\d+$/', array_shift($value));
    }

}

/**
 * app/Model/MyModel.php
 */
class MyModel extends AppModel {

    /**
     * Validation
     *
     * @var array
     */
    public $validate = array(
        'my_field' => array(
            'rule' => 'validateInteger',
            'message' => 'This field only accepts integers'
        )
    );

}

また、これらすべての検証メソッドを含むカスタム検証動作を用意するというアイデアも考えましたが、動作の制限により、特にうまく機能せず、便利ではないことがわかりました。

于 2012-11-06T14:06:26.070 に答える
0

私は自分の質問に対する答えを見つけました:行動。

CakePHP の構造では、次のことを推奨しています。

  • コンポーネントはコントローラで使用する必要があります

  • ヘルパーはビューで使用する必要があります

  • 動作はモデルで使用する必要があります

動作を定義するために、次のことを行いました。

  1. app/Model/Behavior/ValidateBehavior.php ファイル内:

    class ValidateBehavior extends ModelBehavior {
    
        // the first param is the model object
        public function isValidCnp($Model, $data) {
    
        // data is an array that contains the field name and value
        // define validations rules here
        // return true or false
        }
    }
    
  2. 私のモデル app/Model/User.php では、データを検証する必要があります:

     class User extends AppModel {
    
        // link the behavior to the model
        public $actsAs = array('Validate');
    
        // define a custom validation rule that calls a function from the behavior
        public $validate = array(
           'cnp' => array(
               'custom' => array(
                  'rule' => array('isValidCnp')
               )
            ),
        );
     }
    

ビヘイビアーの良いところは、親クラスのように振る舞うように見え、beforeSave、beforeDelete などのコールバック関数を含めることもできることです。

モデルは、独自のメソッドのように動作から関数を呼び出すことができます。これは、動作をコントローラーでも使用できることを意味します。

$this->User->isValidCnp()
于 2012-11-06T15:11:03.190 に答える