Validation cakephp:将变量传递给自定义验证规则

Validation cakephp:将变量传递给自定义验证规则,validation,cakephp,syntax-error,Validation,Cakephp,Syntax Error,我目前在PHP5.3.27上使用CakePHP2.4.5,如果需要,两者都可能会更改(但如果不更改则更好) cakephp模型中的自定义验证规则需要外部数据才能工作,例如: public $nameSpecialChars = '\'- '; public $dotWhitespace = '. '; public $timeLabels = array('Jahr', 'month', 'jour', 'minuta'); public $tlSeparator =

我目前在PHP5.3.27上使用CakePHP2.4.5,如果需要,两者都可能会更改(但如果不更改则更好)

cakephp模型中的自定义验证规则需要外部数据才能工作,例如:

public $nameSpecialChars = '\'- ';
public $dotWhitespace    = '. ';
public $timeLabels       = array('Jahr', 'month', 'jour', 'minuta');
public $tlSeparator      = ', ';
理想情况下,这些将在其他地方定义,但在模型文件的顶部就足够了

我们的想法是,他们以后可能会改变。>例如,nameSpecialChars<用于定义可能出现在人名中的特殊字符;>'<的同义词可能包括,>''Error:syntax Error,意外的T_变量,应为'' 在“规则”行生成致命错误:>错误:语法错误, 意外的T_变量,应为“')”使用: 定义(,); 基于php的页面生成是在页面请求时生成超文本-没有理由不递归使用(在生成php文件时定义模板空间,在页面请求之前将运行时常量插入模板空间)

将标准值写入生成php文件,以便始终有一个有效条目: 定义(“nameSpecialChars”,“|”,“[\'-\s]”); 需要时,使用正则表达式或类似表达式替换值

public $validate = array(
                         'street' => array(
                                           'required'  =>true ,
                                           'allowEmpty'=>false,
                                           'rule'      =>array('isName', $nameSpecialChars)
                                          )
                        );
// Names must contain only letters and a couple of special characters.
// note on UTF8 handling pre-php6: https://stackoverflow.com/a/16862181/3434465
// whole thing should be reworked once proper UTF8 support is available
public function isName($check, string $allowedSpecialChars)
{
  setlocale(LC_CTYPE, 'utf8'); // to ensure correct ctype_alpha evaluation;
                               // may change arbitrarily during server operation, thence always ensure it be set
  if(mb_substr($allowedSpecialChars, -1) != 'u')
  {
    $allowedSpecialChars = $allowedSpecialChars . 'u'; // ensure that UTF8-flag is set
  }

  $name = array_values($check)[0]; // reduce to input string; bit of a hack, better replace once better way found
  $charArray = preg_split("//u", $name, -1, PREG_SPLIT_NO_EMPTY); // theoretically UTF8-aware split

  bool validCharacters = true;
  foreach($charArray as $char) // not quite UTF8 compatible, I fear
  {
    validCharacters = validCharacters && (
                                          ctype_alpha($char) // UTF8-aware due to locale
                                          ||
                                          preg_match($allowedSpecialChars, $char, null) // UTF8-aware due to terminating 'u'-flag
                                         );
  }
  return validCharacters;
}