Yii2通过第二个模型验证,带有when验证器

Yii2通过第二个模型验证,带有when验证器,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,当验证器运行时,是否可以通过另一个模型进行验证?我的意思是: return [ [['user_id', 'country_id', 'region_id', 'city_id'], 'integer'], [['name', 'address', 'eik', 'mol', 'dds'], 'string'], [['name', 'address', 'mol'], 'string', 'max' => 255],

当验证器运行时,是否可以通过另一个模型进行验证?我的意思是:

return [
            [['user_id', 'country_id', 'region_id', 'city_id'], 'integer'],
            [['name', 'address', 'eik', 'mol', 'dds'], 'string'],
            [['name', 'address', 'mol'], 'string', 'max' => 255],
            [['eik'], 'string', 'max' => 40],
            [['dds'], 'string', 'max' => 1],
            [
                [
                    'user_id',
                    'country_id',
                    'region_id',
                    'city_id',
                    'name',
                    'address',
                    'eik',
                    'mol',
                    'dds',
                ],
                'required',
                'on' => self::SCENARIO_UPDATE,
                'when' => function($model ( THIS SHOULD BE THE SECOND MODEL ) ){
                    return $model->someField;
                },
                'whenClient' => 'function(attribute, value){
                    return $("#someSelector").val() == 2
                }'
            ]
        ];

其中,
中的
$model
条件为
model B
时。当我向
模型B
字段添加值时,应启用验证。在客户机部分,我可以通过选择器选择任何字段,但服务器端部分是否可行?

我想这不是最好的解决方案,但您可以尝试以下方法:

'when' => function(){
    if(Yii::$app->request->post('YOUR_MODEL_B')['YOUR_ATTRIBUTE']=="whatever"){
        // do your thing    
    }
}

您可以将此相关模型指定给主模型:

$model = new MyModel();
$model->someModel = new SomeModel();

$model->someModel->load(Yii::app()->request->post());
$model->load(Yii::app()->request->post());
然后在
MyModel
的验证规则中:

'when' => function($model){
    return $model->someModel->someField;
},


但是如果您有这样的问题,那么这是一个好迹象,您不应该直接使用
ActiveRecord
来处理此表单。您应该创建专门用于处理此指定表单及其所有字段的分离表单模型。

这确实不是一个很好的方法。如果
POST
不包含这样的数组索引怎么办?然后您会得到一个
通知
错误。在模型中使用
POST
通常是一个糟糕的建议。活动记录应该是独立于上下文的-它甚至应该在控制台环境中工作,在那个里并没有POST数据。我不这么认为。。。自定义方法呢?好吗?好的,我会试试这条路。比你快!明天将尝试并给出反馈。