私が拡張したベースモデルがあります。 ここでは、2つの検証フィルタを定義しました。レコードが一意であるかどうかをチェックし、レコードが存在するかどうかをチェックします。それらは、返り値が他の値の逆になることを除いて全く同じ方法で動作します。リチウム:別の内部から1つのバリデーションフィルタを呼び出す方法
したがって、異なる値を返すだけで同じコードを2回書くのは正しいとは言えません。 カスタムバリデーターを別のバリデーターから呼び出す方法を知りたいです。
<?php
Validator::add('unique', function($value, $rule, $options) {
$model = $options['model'];
$primary = $model::meta('key');
foreach ($options['conditions'] as $field => $check) {
if (!is_numeric($field)) {
if (is_array($check)) {
/**
* array(
* 'exists',
* 'message' => 'You are too old.',
* 'conditions' => array(
*
* 'Users.age' => array('>' => '18')
* )
*)
*/
$conditions[$field] = $check;
}
} else {
/**
* Regular lithium conditions array:
* array(
* 'exists',
* 'message' => 'This email already exists.',
* 'conditions' => array(
* 'Users.email' //no key ($field) defined
* )
*)
*/
$conditions[$check] = $value;
}
}
/**
* Checking to see if the entity exists.
* If it exists, record exists.
* If record exists, we make sure the record is not checked
* against itself by matching with the primary key.
*/
if (isset($options['values'][$primary])) {
//primary key value exists so it's probably an update
$conditions[$primary] = array('!=' => $options['values'][$primary]);
}
$exists = $model::count($conditions);
return ($exists) ? false : true;
});
?>
exists
は次のように動作するはずです::
ここunique
バリのための私のコードです
<?php
Validator::add('exists', function($value, $rule, $options) {
$model = $options['model'];
return !$model::unique($value, $rule, $options);
});
?>
しかし、明らかに、それはそのように行うことはできません。検証関数を無名関数として定義し、それを変数に代入してクロージャの代わりに渡す必要がありますか? exists
からunique
と電話する方法はありますか?
ありがとう@rmarscher。 私はあなたが戻ってきたラインを短くしたのを見ました、私はそれをしなければならないと思います:) しかし、なぜあなたはそこに '$ self'を設定しますか? – Housni
また、内部で必要とされるため、$ valueを 'unique'メソッドに渡す必要があります。 – Housni
ああ、偶然、 '$ self'の設定をコピーして貼り付けたと思うのですが、これは、現在のオブジェクトをコールバック内で利用できるようにするためにフィルタのいくつかで行う必要があるからです(' $ self'は '関数定義の 'use'節を参照してください)。 そして、私は '$ value'部分を修正しました。しかし、ええ、あなたのところに良い解決策。投稿を打つ前にページをリフレッシュしていれば私は投稿していないでしょう。 – rmarscher