CakePHP 3 - 使用可重用的验证器

时间:2017-05-10 14:32:18

标签: php validation cakephp

在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),其中说的是

  

验证规则在

中定义

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

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

由于Cake 3中的Table和Entity模型类不同,有人可以解释如何验证文件上传之类的内容,特别是考虑到甚至可能没有表吗?

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

1 个答案:

答案 0 :(得分:4)

表格提供合约

实际上并不那么复杂。为方便起见,在表上定义了与表有关的验证规则。它们不必在那里定义,它们可以在自定义验证类中定义,但最后表对象提供所请求的验证规则集。

验证实体是公共验证流程的一部分。由于实体是传递给表的数据集,因此它应该包含决定实体是否有效的规则的表,因为这些表是关注的。

另见

继承验证规则

组合验证器非常简单,只需将您的自定义验证对象传递给表类中的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); ,并使用自定义验证对象规则和默认值验证您的数据/实体。

另见

验证与模型层无关

除此之外,验证不依赖于模式层,它只是利用它,您可以随时使用验证对象,即如果您想手动验证数据,只需实例化验证器类并将其用于验证您的数据:

hibernate.dialect=org.hibernate.dialect.MySQLDialect  //you should use mysql dialect from pom I see that you use mysql
#hibernate.default_schema=myCustomName                //commented out in case you want use default schema, else you can use this property to create your custom schema
hibernate.show_sql=true                               //this will help so see what queries are executed
hibernate.format_sql=true                             //this will print formatted sql
hibernate.hbm2ddl.auto=create                         //this will generate database tables if they don't exist in DB, also you can change to "update" this property then database will get updates.

另见