Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2-验证嵌套对象_Yii_Yii2 - Fatal编程技术网

Yii2-验证嵌套对象

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()

这是一个关于我思考了一段时间的话题的问题

在Yii2中,通常建议为您的请求创建表单模型。将规则添加到这些模型中以验证输入。Yii2指南中的EntryForm就是一个例子

<?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;
        }
    }
}