动态/动态CakePhp 3验证和FormHelper

时间:2017-09-28 16:38:48

标签: validation cakephp formhelper

我正在CakePHP中创建一个“表单编辑器”。

界面允许用户选择要应用于字段的验证,例如数字,电子邮件等。

因此,我需要根据用户输入动态创建模型验证。为此,我可以使用Validation对象:https://book.cakephp.org/3.0/en/core-libraries/validation.html

我想利用FormHelper的功能,例如,自动输出字段的错误消息。

我可以看到如何使用模型中的硬编码验证器通过在Form-> create()的上下文选项中设置验证器来完成此操作 - 但是如何使用已经使用的客户$ Validator对象动态创建?

澄清:

我的控制器中有一些代码:

//get the form configuration
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]);


//set up validation based on the configuration

$validator = new Validator();
foreach($form->form_fields as $field){
  ...
  if($field->required) $validator->notBlank($field->field_name);

}


$table = TableRegistry::get($form->type);

$table->setValidator($validator);

不幸的是,setValidator()不是TableRegistry的方法。

如果我在模型中设置验证,我需要$ id参数来查找正确的表单配置。

1 个答案:

答案 0 :(得分:1)

我将以下代码添加到我的模型中:

protected $validator = null;  

public function validationDefault(Validator $validator){
  if($this->validator != null) return $this->validator;
  return $validator;
}

public function setValidator(Validator $validator){
  $this->validator = $validator;
}

因此可以通过setValidator方法有效地设置默认验证器。

然后在我的控制器中:

//get the form configuration
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]);


//set up validation based on the configuration

$validator = new Validator();
foreach($form->form_fields as $field){
   ...
   if($field->required) $validator->notBlank($field->field_name);

}


$table = TableRegistry::get($form->type);

$table->setValidator($validator);

我希望这对其他人有用。