【问题标题】:On the fly / dynamic CakePhp 3 Validation and FormHelper动态/动态 CakePhp 3 验证和 FormHelper
【发布时间】:2017-09-28 16:38:47
【问题描述】:

我正在 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 参数来查找正确的表单配置。

【问题讨论】:

  • 您的问题看起来好像缺少实际问题,因为对象的创建方式并不重要,一旦创建,您就可以使用它,无论其来源如何。
  • 感谢 ndm。我想那我的问题是怎么做?我可以创建一个 Validator 对象。我可以使用该对象运行验证,但是如何设置表 (?) 以使用它以便表单助手可以访问错误?
  • 如果您能说明创建验证器的位置和方式,以及它是如何用于验证的,这可能会有所帮助。如果您在例如validationDefault()(或模型中的任何验证方法)中创建它,或者通过Model.buildValidator 事件创建它,那么您不需要做任何事情,验证错误通常会存储在实体上,所以在大多数情况下,首先不需要手动触摸验证器对象,您只需将实体传递给表单助手。
  • 当然,抱歉。我在控制器中定义验证对象,因为我使用 url 参数来定义要使用的表单配置。有一个模型存储表单配置,然后为不同的模型生成表单。我将看看是否可以在模型中定义验证对象,但我不确定是否可以访问那里的 url 参数?接下来在我的列表中尝试。
  • 应该有多种方法将值注入模型层,例如通过patchEntity()/newEntity() 中的validate 选项,或使用简单的setter 方法。如果你展示一些你的控制器和模型的示例代码,我可能会给你一些更准确的建议。

标签: validation cakephp formhelper


【解决方案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);

我希望这对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2018-01-30
    • 2016-05-22
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多