2017-08-24 1 views
0

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

+0

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

+0

Ja, ich habe einige Log-in, Logging funktioniert in der BeforeValidate die Regeln in Helper schrieb nichts, so traf nicht die Regel. – alistaircol

+0

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 –

Antwort

0

Sie Paar Optionen könnten hier haben:

  • die benutzerdefinierten Validierungsregeln in der AppModel definieren, auf diese Weise können Sie sie in jedem Modell ohne das Kopieren
  • erstellen ein abstraktes Modell verwenden können, beispielsweise Job, und erweitern Sie dann dieses Modell, um CustomJobA, CustomJobB usw. zu erstellen, und definieren Sie dort die benutzerdefinierten Validierungen. Alle Modelle, die das Jobmodell erweitern, könnten Ihre Validierungsregeln verwenden
  • Erstellen Sie ein Verhalten, definieren Sie die Validierungsregeln dort und verwenden Sie dieses Verhalten für jedes Modell.
Verwandte Themen