Ich benutze CakePHP2.8 und ich möchte mehrere benutzerdefinierte Validierungsmethoden zwischen Modellen teilen.CakePHP 2 Freigabe benutzerdefinierte Prüfmethoden, userDefined
Ich habe einen Helfer CustomValidators.php
Klasse mit benutzerdefinierten Prüfmethoden erstellt, die innerhalb von Modellen arbeiten. Logik hier ist kein Problem, hier nur zur Veranschaulichung.
<?php
App::uses('CakeLog', 'Utility');
class CustomValidators {
public function checkDateNotFuturePast($checks, $params)
{
$params += array(
'type' => 'past', //Date cannot be in the past
'current_date' => 'now', //Todays date
'include_current_date' => false //Allow current date to pass validation
);
CakeLog::write('error', print_r(json_encode([
'checks' => $checks,
'params' => $params,
]), true));
$date = array_values($checks)[0];
try {
$timezone = new DateTimeZone("UTC");
$input_date = new DateTime($date, $timezone);
$current_date = new DateTime($params['current_date'], $timezone);
} catch(Exception $e) {
return false;
}
switch ($params['type']) {
case 'future':
if($params['include_current_date']){
if($input_date->format('dmY') != $current_date->format('dmY')&&$input_date->format('U') > $current_date->format('U')) return false;
}else{
if($input_date->format('U') > $current_date->format('U')) return false;
}
break;
case 'past':
if($params['include_current_date']){
if($input_date->format('dmY') != $current_date->format('dmY')&&$input_date->format('U') <= $current_date->format('U')) return false;
}else{
if($input_date->format('U') < $current_date->format('U')) return false;
}
break;
}
return true;
}
public function checkNotOlderThan($check, $params)
{
CakeLog::write('error', 'CustomValidators::checkNotOlderThan');
$params += [
'current_date' => date('Y-m-d'),
];
CakeLog::write('error', print_r(json_encode([
'checks' => $checks,
'params' => $params,
]), true));
if (!isset($params['range'])) {
return false;
}
$date = array_values($check)[0];
try {
$current_date = new DateTime($params['current_date']);
$current_date->modify('-' . $params['range']);
$input_date = new DateTime($date);
} catch(Exception $e) {
return false;
}
if ($input_date >= $current_date) {
return true;
}
return false;
}
}
Ich schließe diese Datei in dem Modell JobCustomA
und es in beforeValidate
instanziieren.
public function beforeValidate($options = [])
{
$CustomValidators = new CustomValidators();
Ich versuche, alle Validierung für JobCustomA
in seinem Modell zu haben, die Daten von Job
validieren.
In meinem JobCustomA
Modell I Validierung auf Job
hinzufügen möchten, ich bin wie so tun:
public function beforeValidate($options = [])
{
$CustomValidators = new CustomValidators();
$this->Job->validator()->add('deposit_paid', [
'not_future' => [
'rule' => [
'userDefined', $CustomValidators, 'checkDateNotFuturePast', [
'type' => 'future',
]
],
'message' => 'Deposit date can\'t be in the future',
],
'nottooold' => [
'rule' => [
'userDefined', $CustomValidators, 'checkNotOlderThan', [
'current_date' => date('Y-m-d'),
'range' => '120 days',
],
],
'message' => 'Deposit date can\'t have been paid more than 120 days ago',
],
]);
// ...
}
jedoch nicht auf diese benutzerdefinierten Validierungsmethoden gehen zu sein scheint, ich bin nicht sicher wie man das beheben kann. Ich muss in der Lage sein, benutzerdefinierte Validierungsmethoden zwischen vielen Klassen wiederzuverwenden, ohne sie in jedem Modell zu duplizieren.
TL; DR: Mit userDefined
Rolle in Validator add nicht funktioniert, müssen viele benutzerdefinierte Validierungsverfahren zwischen mehreren Modellen wieder zu verwenden.
Dank
Sind Sie sicher, dass es die Regel ist, die nicht funktioniert? Haben Sie getestet, dass die Methode 'beforeValidate()' überhaupt aufgerufen wird und vor allem, dass sie aufgerufen wird, bevor die Validierung auf die 'Job'-Modelldaten angewendet wird? – ndm
Ja, ich habe einige Log-in, Logging funktioniert in der BeforeValidate die Regeln in Helper schrieb nichts, so traf nicht die Regel. – alistaircol
Haben Sie einen Blick auf diese https://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods geworfen Es erklärt, wie Sie eine benutzerdefinierte Validierung Methoden richtig definieren können –