Yii动力学验证。还有别的办法吗?

Yii动力学验证。还有别的办法吗?,yii,Yii,我有一些模型。根据typeId的值,应该需要一些参数 typeId=1 Required: param2 param3 param4 param5 param6 param7 param9 typeId=2 Required: param1 param3 param4 param5 typeId=3 Required: param1 param3

我有一些模型。根据typeId的值,应该需要一些参数

typeId=1    Required:       param2  param3  param4  param5  param6  param7      param9  
typeId=2    Required:   param1      param3  param4  param5                  
typeId=3    Required:   param1      param3                  param8  param9  
typeId=4    Required:   param1      param3                          
typeId=5    Required:   param1                                  param10
所以我就这样解决了:

public function rules()
{
    return array(
        array('typeId, param1, param2', 'numerical', 'integerOnly'=>true),
        array('param3, param4, param5, param6, param7, param8, param9', 'length', 'max'=>20),
        array('param10, param11', 'length', 'max'=>255),
        array('created, deleted', 'safe'),

        array('typeId', 'required', 'on'=>'insert, update'),
        array('typeId', 'exist', 'attributeName'=>'id', 'className'=>'Type', 'message'=>'Select {attribute}'),

        array('id, typeId, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, created, deleted', 'safe', 'on'=>'search'),            

        //dynamic rules

        array('param1', 'required', 'on'=>'type2, type3, type4, type5'),
        array('param1', 'exist', 'attributeName'=>'id', 'className'=>'Param1', 'message'=>'Select {attribute}', 'on'=>'type2, type3, type4, type5'),

        array('param2', 'required', 'on'=>'type1'),
        array('param2', 'exist', 'attributeName'=>'id', 'className'=>'Param2', 'message'=>'Select {attribute}', 'on'=>'type1'),
        array('param3', 'required', 'on'=>'type1, type2, type3, type4'),
        array('param4', 'required', 'on'=>'type1, type2'),
        array('param5', 'required', 'on'=>'type1, type2'),
        array('param6', 'required', 'on'=>'type1'),
        array('param7', 'required', 'on'=>'type1'),
        array('param8', 'required', 'on'=>'type3'),

        array('param9', 'required', 'on'=>'type1, type3'),
        array('param10', 'required', 'on'=>'type5'),
    );
}


public function validate($attributes=null, $clearErrors=true)
{
    if($clearErrors)
        $this->clearErrors();
    if($this->beforeValidate())
    {
        foreach($this->getValidators() as $validator)
            $validator->validate($this,$attributes);

        //validate dynamic rules
        if(!$this->hasErrors())
        {
            $scenario=$this->scenario;
            if($this->scenario=$this->getSubscenario($this->signalId))
            {
                foreach($this->getValidators() as $validator)
                    $validator->validate($this,$attributes);
            }
            $this->scenario=$scenario;
        }
        $this->afterValidate();
        return !$this->hasErrors();
    }
    else
        return false;
}

public function getSubscenario($typeId)
{
    switch($typeId)
    {
        case Signal::TYPE_1:
            return 'type1';
        case Signal::TYPE_2:
            return 'type2';
        case Signal::TYPE_3:
            return 'type3';
        case Signal::TYPE_4:
            return 'type4';
        case Signal::TYPE_5:
            return 'type5';
        default:
            return false;
    }
}    

还有别的方法吗?

现在的方法有什么问题吗?我觉得有点复杂。也许可以用Yii工具解决,而无需双重验证?我知道我可以编写自定义验证器。但在这种情况下,必须用不同的语言准备错误消息。模型创建后是否需要更改类型?如果没有,您可以为此使用5个不同的子类。