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

Спасибо

1 ответ

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

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