【问题标题】:CakePHP 3 - Using reusable validatorsCakePHP 3 - 使用可重用的验证器
【发布时间】:2017-05-10 14:32:17
【问题描述】:

在 CakePHP 3 文档中有一个关于可重用验证器的部分:https://book.cakephp.org/3.0/en/core-libraries/validation.html#creating-reusable-validators

它并没有说明你如何使用它们,但在控制器中。谁能举个例子?

我有一个允许上传 .csv 文件的特定应用程序。应用程序中 .csv 文件的验证始终相同:检查其 MIME 类型、检查大小、检查扩展名等。

所以我的计划是将其实现为可重用的验证器 - 对吗?

我有一个 UploadsController.php 和一个 upload() 函数,我想用它来验证来自表单的数据。我很困惑,因为此时我没有创建实体 - 而只是试图验证我的文件 - 所以文档中的所有这些 patchEntity() 内容在这里毫无意义。

我发现关于 Cake 3 验证的文档非常混乱,因为在 ORM (https://book.cakephp.org/3.0/en/orm/validation.html) 下有一个部分,上面写着

验证规则在Table类中定义

但后来,它有一个完全不同的部分来验证实体 (https://book.cakephp.org/3.0/en/core-libraries/validation.html#validating-entities)。

然后我们有可重用的验证器......以及其他各种东西。

由于 Cake 3 中的表和实体模型类不同,有人可以解释一下您将如何验证文件上传之类的东西,特别是考虑到甚至可能根本没有表涉及?

如果您在表单上有一个组合,您需要使用 both 一个可重用的验证器(用于验证 .csv 等常见任务),以及一个单独的规则集可能在 Table 模型类中的特定表?

【问题讨论】:

  • 你为什么不创建一个 UploadComponent 来做所有的上传工作,包括验证?
  • @RayannNayran 我想了解如何使用提供的可重用验证器,但看不到如何在我的控制器中引用它。目前我的表单提交给UploadsController:upload()。如果我要创建src/Model/Validation/CsvValidator.php,那么我如何通过UploadsController:upload() 将表单数据传递给它并取回验证消息?

标签: php validation cakephp


【解决方案1】:

表格提供合同

其实没那么复杂。 为了方便,在表上定义了涉及表的验证规则。它们不必在此处定义,它们可以在自定义验证类中定义,但最终表格对象提供了请求的验证规则集。

验证实体是常见验证流程的一部分。由于实体是传递给表的数据集,因此应该由表来保存决定实体是否有效的规则,因为这是表所关心的。

另见

继承验证规则

组合验证器非常简单,只需将您的自定义验证对象传递给表类中的validation*() 方法,该方法提供您想要继承的规则,类似于:

public function validationDefault(Validator $validator)
{
    $validator
        ->add(/* ... */);

    return $validator;
}

public function validationCustomAndDefault()
{
    $validator = new \App\Model\Validation\CustomModelValidator();

    return $this->validationDefault($validator);
}

然后只需将validate 选项配置为customAndDefault,您的数据/实体就会使用您的自定义验证对象规则和默认规则进行验证。

另见

验证与模型层无关

除此之外,验证不依赖于模式层,它只是利用它,你可以在任何你想要的地方使用验证对象,即如果你想手动验证数据,只需实例化一个验证器类并使用它来验证您的数据:

$validator = new \App\Validation\CustomGenericValidator();
$errors = $validator->errors($data);

另见

【讨论】:

  • 感谢您的出色解释。这比 Cake 文档要好得多,尤其是您提到“验证与模型层无关”的那一点——如果您阅读了根本不清楚的 Cake 文档,因为他们通常在谈论验证数据进入数据库表。
猜你喜欢
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2017-11-06
  • 2019-12-04
相关资源
最近更新 更多