2

新しいレコードを挿入するために CakePHP (2.3.4) Model::save メソッドを調査していたところ、ちょっとした障害に遭遇しました。

//Two fields provided, email field intended to fail validation
$data = array('Member' => array(
    'username' => 'hello',
    'email' => 'world'
));
$this->Member->create();
var_dump($this->Member->save($data, true));

上記の save() は false を返し、データはデータベースに書き込まれません。ただし、データを次のように変更すると:

//One field provided, intended to pass validation
$data = array('Member' => array(
    'username' => 'hello'
));

次に、save() は、空白の電子メール フィールドを使用してデータベースに新しいレコードを書き込もうとします。指定されていないフィールドの検証をスキップすることは、更新中に役立つ動作になる可能性があることを理解していますが、新しいレコードを作成するときに部分的に空のデータセットを処理するための CakePHP の推奨される方法はありますか? どうもありがとう。

編集: ヒントを提供してくれた Sam Delaney に感謝します。他の誰かが困惑した場合に備えて、これはトリックを行いました: CakePHP Data Validation: field 'required' key

このキーは、ブール値、作成または更新のいずれかを受け入れます。このキーを true に設定すると、フィールドは常に必須になります。create または update に設定すると、フィールドは update または create 操作にのみ必要になります。'required' が true と評価された場合、フィールドはデータ配列に存在する必要があります。たとえば、検証ルールが次のように定義されているとします。

required => true私はもともとモデルを焼き付けていましたが、それが検証ルールから除外されていたことを忘れていました。trueまたはに設定すると、意味'create'不明なデータ配列が原因で空白のレコードが挿入されるのを回避できます。

4

1 に答える 1

1

あなたが経験した私見は、望ましい動作です。フォーム内に同じ 2 つのフィールドがあり、ユーザーが値のみを提供するとしますusername。が空であっても、usernameとフィールドの両方emailが送信されます。email次に、サーバーでレコードを保存しようとして、ユーザーにフィードバックする検証に失敗したことを確認します。一方、あなたのシステムでは、メールを必要とせずにユーザーを作成することは完全に可能です (たとえば、rootアクセス アカウント)。CakePHP の検証実装は、これらの両方のシナリオを可能にします。

この柔軟性が必要ない場合はrequired、検証ルールの属性を次のように設定してtrueください。

public $validate = array(
    'email' => array(
        'rule'     => 'email',
        'required' => true
    )
);

これにより、すべてか無かの要件が満たされます。

于 2013-05-02T07:08:23.067 に答える