如何在同一领域中使用许多自定义验证器

时间:2016-10-04 17:37:53

标签: php yii2

在同一个字段中,我有两种可能的数据类型:CPFCNPJ。我单独使用custom component进行验证,例如:

['cnpj', CnpjValidator::className(), 'skipOnError' => true]

['cpf', CpfValidator::className(), 'skipOnError' => true]

但是我尝试将两个类用于同一个字段cnpj_cpf并且它没有成功。规则将根据属于同一模型的natureza属性单独应用。

类似的东西:

if($model->natureza == 'F'){
// apply CpfValidator::className()
else {
// apply CnpjValidator::className()
}

@edit

规则方法

public function rules()
    {
        return [
            [['nome', 'nome_abrev', 'email', 'cliente_grupo_id'], 'required'],
            [['email', 'email_nfe'], 'email'],
            ['cnpj_cpf', CnpjValidator::className(), 'skipOnError' => true, 'when' => function($model){
                return $model->natureza == 'J';
            }],
            ['cnpj_cpf', CpfValidator::className(), 'skipOnError' => true, 'when' => function($model){
                return $model->natureza == 'F';
            }],
            [['natureza', 'observacoes'], 'string'],
            [['ativo', 'gera_gnre', 'simples_nacional', 'sintegra', 'emitir_laudo', 'controla_pallet', 'controla_edi', 'regime_especial', 'gera_st', 'termos_industrializacao', 'termo_isencao', 'cod_suframa', 'insc_subs_tributaria', 'ean', 'cliente_grupo_id', 'cliente_ramo_atividade_id', 'localizacao_microrregiao_id', 'venda_canal_id', 'venda_condicao_pagamento_id', 'usuario_representante_id'], 'integer'],
            [['data_suframa','limite_credito_validade','data_insc_subs_tributaria'], 'default', 'value' => null],
            [['data_suframa', 'data_insc_subs_tributaria', 'limite_credito_validade'], 'safe'],
            [['limite_credito', 'desconto_financeiro'], 'number'],
            [['nome', 'nome_abrev', 'insc_estadual', 'insc_municipal', 'email', 'email_nfe', 'website', 'banco', 'banco_ag', 'banco_cc', 'natureza_operacao'], 'string', 'max' => 255],
            [['cnpj_cpf'], 'string', 'max' => 18],
            [['website'], 'url',  'defaultScheme' => 'http'],
            [['nome_abrev'], 'unique'],
            [['venda_canal_id'], 'exist', 'skipOnError' => true, 'targetClass' => VendaCanal::className(), 'targetAttribute' => ['venda_canal_id' => 'id']],
            [['venda_condicao_pagamento_id'], 'exist', 'skipOnError' => true, 'targetClass' => VendaCondicaoPagamento::className(), 'targetAttribute' => ['venda_condicao_pagamento_id' => 'id']],
            [['cliente_grupo_id'], 'exist', 'skipOnError' => true, 'targetClass' => ClienteGrupo::className(), 'targetAttribute' => ['cliente_grupo_id' => 'id']],
            [['localizacao_microrregiao_id'], 'exist', 'skipOnError' => true, 'targetClass' => LocalizacaoMicrorregiao::className(), 'targetAttribute' => ['localizacao_microrregiao_id' => 'id']],
            [['cliente_ramo_atividade_id'], 'exist', 'skipOnError' => true, 'targetClass' => ClienteRamoAtividade::className(), 'targetAttribute' => ['cliente_ramo_atividade_id' => 'id']],
            [['usuario_representante_id'], 'exist', 'skipOnError' => true, 'targetClass' => UsuarioRepresentante::className(), 'targetAttribute' => ['usuario_representante_id' => 'id']]
        ];
    }

1 个答案:

答案 0 :(得分:1)

你可以尝试:

['cnpj_cpf', CnpjValidator::className(), 'skipOnError' => true, 'when' => function($model){
    return $model->natureza != 'F';
}],
['cnpj_cpf', CpfValidator::className(), 'skipOnError' => true, 'when' => function($model){
    return $model->natureza == 'F';
}],

详细了解Conditional Validation