Yii2-验证嵌套对象
这是一个关于我思考了一段时间的话题的问题 在Yii2中,通常建议为您的请求创建表单模型。将规则添加到这些模型中以验证输入。Yii2指南中的EntryForm就是一个例子Yii2-验证嵌套对象,yii,yii2,Yii,Yii2,这是一个关于我思考了一段时间的话题的问题 在Yii2中,通常建议为您的请求创建表单模型。将规则添加到这些模型中以验证输入。Yii2指南中的EntryForm就是一个例子 <?php namespace app\models; use Yii; use yii\base\Model; class EntryForm extends Model { public $name; public $email; public function rules()
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class EntryForm extends Model
{
public $name;
public $email;
public function rules()
{
return [
[['name', 'email'], 'required'],
['email', 'email'],
];
}
}
对于简单的情况,您可以在表单模型中使用一个模型和自定义验证器:
public function rules() {
return [
// ...
['stores', 'validateStores'],
];
}
public function validateStores() {
$phoneValidator = new StringValidator(); // use real validators
$nameValidator = new StringValidator(); // use real validators
foreach ($this->stores as $store) {
if (!$phoneValidator->validate($store['phone'], $error)) {
$this->addError('stores', $error);
return; // stop on first error
}
if (!$nameValidator->validate($store['name'], $error)) {
$this->addError('stores', $error);
return; // end on first error
}
}
}
validateStores()
可以被提取为单独的验证器类,然后您也可以使用而不是foreach
对于更复杂的嵌套模型,您可能应该为存储创建单独的
StoreForm
模型(因此您将拥有嵌套的表单模型),并在子项上调用validate()
/**
* @var StoreForm[]
*/
public $stores;
public function rules() {
return [
// ...
['stores', 'validateStores'],
];
}
public function validateStores() {
foreach ($this->stores as $store) {
if (!$store->validate()) {
$this->addError('stores', 'Stores config is incorrect.');
return;
}
}
}
您仍然可以使用formmodel将所有规则添加到该模型中,而不是基本模型中,并且这两个模型都通过formmodel进行验证,就这么简单。这意味着您可以在
formmodel
中列出所有验证规则,并且您的客户
和地址
模型可以使用定义字段的基本规则进行清理作为safe
、strings
、integer
或required
我将编辑这个问题,以提及我应该提到的其他一些场景:这就是我所指的@MuhammadOmerAslam,但是当我第一次问的时候我不清楚:)rob006已经在下面贴出了答案,它提供了正确的方法。我喜欢这种方法。但这里还有一个问题:)您认为我应该在多大程度上依赖原始模型验证?在这个例子中,很难说是客户和BranchIt,这实际上取决于应用程序,所以这里没有一个正确的答案。在一个应用程序中,我甚至没有AR中的验证,所有内容都是在表单模型中验证的。有时候AR就足够了,你不需要表单模型。好的,非常感谢。我真的很喜欢这种方法。我试试看:D
/**
* @var StoreForm[]
*/
public $stores;
public function rules() {
return [
// ...
['stores', 'validateStores'],
];
}
public function validateStores() {
foreach ($this->stores as $store) {
if (!$store->validate()) {
$this->addError('stores', 'Stores config is incorrect.');
return;
}
}
}