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

时间:2014-04-10 09:50:31

标签: validation cakephp syntax-error

我目前在PHP 5.3.27上使用cakePHP 2.4.5,如果有必要,两者都可能会改变(但如果不是这样会更好)。

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

public $nameSpecialChars = '\'- ';
public $dotWhitespace    = '. ';
public $timeLabels       = array('Jahr', 'month', 'jour', 'minuta');
public $tlSeparator      = ', ';

理想情况下,这些将在其他地方定义,但在模型文件的顶部现在已经足够了。

这个想法是他们可能会在以后改变。 > nameSpecialChars<例如,用于定义可能出现在人名中的特殊字符; >'<的同义词可以包括,>'<,>`<等等。

但是,定义使用它们的规则似乎不起作用:

public $validate = array(
                         'street' => array(
                                           'required'  =>true ,
                                           'allowEmpty'=>false,
                                           'rule'      =>array('isName', $nameSpecialChars)
                                          )
                        );

在'规则'行生成致命错误:>错误:语法错误,意外T_VARIABLE,期待')'<。

我发现将another field作为参数传递可以通过包含带有字段名称的字符串来完成,documentation演示通过写出来传递常量。 - 后者意味着将字符串传递给字符串参数会将其解释为常量,而不是字段名称......或者是吗?

我该如何传递这些变量?
或者:有没有更好的方法来实现这些元素的外部化?

作为参考,这里是引用的自定义规则的功能(请注意它是占位符字符):

// 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;
}

2 个答案:

答案 0 :(得分:1)

  

在'规则'行生成致命错误:>错误:语法错误,   意外的T_VARIABLE,期待')'<。

php basics:你不能在属性声明中使用变量。

将规则添加到beforeValidate()回调中的validate属性。

答案 1 :(得分:0)

使用:     define(,); 基于php的页面生成在页面请求上生成超文本 - 没有理由不采用递归方式(在生成php文件时定义模板空间,在页面请求之前插入运行时常量到模板空间中)。

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