CakePHP 2 разделяет пользовательские методы проверки, userDefined

Я использую 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 роль в добавлении валидатора не работает, необходимо повторно использовать множество пользовательских методов валидации между несколькими моделями.

Спасибо

0

Решение

Вы могли бы иметь несколько вариантов здесь:

  • Определите пользовательские правила проверки в AppModel, чтобы их можно было использовать в любой модели без копирования.
  • Создайте абстрактную модель, например, Job, а затем расширьте эту модель, чтобы создать CustomJobA, CustomJobB и т. Д., И определите там пользовательские проверки. Все модели, расширяющие модель Job, могут использовать ваши правила проверки
  • Создайте поведение и определите там правила проверки и используйте это поведение в любой модели.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]