Я использую CakePHP2.8, и я хотел бы поделиться несколькими пользовательскими методами проверки между моделями.
Я создал помощника CustomValidators.php
Класс с использованием пользовательских методов проверки, которые работают в моделях. Логика здесь не проблема, здесь только для иллюстрации.
<?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;
}
}
Я включаю этот файл в модель JobCustomA
и создание его в beforeValidate
,
public function beforeValidate($options = [])
{
$CustomValidators = new CustomValidators();
Я пытаюсь получить все проверки для JobCustomA
в своей модели, которая будет проверять данные из Job
,
В моем JobCustomA
модель, которую я хочу добавить проверки на Job
Я делаю так:
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',
],
]);
// ...
}
Однако, похоже, что эти пользовательские методы проверки не подходят, я не уверен, как это исправить. Мне нужно иметь возможность повторно использовать пользовательские методы проверки между многими классами, не дублируя их в каждой модели.
TL; DR: С помощью userDefined
роль в добавлении валидатора не работает, необходимо повторно использовать множество пользовательских методов валидации между несколькими моделями.
Спасибо
Вы могли бы иметь несколько вариантов здесь:
Других решений пока нет …