如果存在条件,则使用其他规则验证字段

时间:2016-03-01 10:00:58

标签: php laravel-5.1

在意大利,税码是一组16个字母数字字符,而增值税号码是11位数字,但在某些条件下,税码可能等于增值税。 我在Laravel 5.1中创建了两个自定义验证规则来检查这两种数据类型,但我不知道告诉框架“如果税码是11位数,请验证为增值号!”。

以下是app / Providers / AppServiceProvider.php的代码

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {

        //validate tax_code
        Validator::extend('tax_code', function($attribute, $value, $parameters, $validator) {
            if($value=='')
                return false;

            if ((strlen($value) == 11) && is_numeric($value))
            {
                //validate as vat number
            }

            if(strlen($value)!= 16)
                return false;

            $value=strtoupper($value);

            if(!preg_match("/[A-Z0-9]+$/", $value))
                return false;

            $s = 0;
            for($i=1; $i<=13; $i+=2){
                $c=$value[$i];
                if('0'<=$c and $c<='9')
                    $s+=ord($c)-ord('0');
                else
                    $s+=ord($c)-ord('A');
            }

            for($i=0; $i<=14; $i+=2){
                $c=$value[$i];
                switch($c){
                    case '0':  $s += 1;  break;
                    case '1':  $s += 0;  break;
                    case '2':  $s += 5;  break;
                    case '3':  $s += 7;  break;
                    case '4':  $s += 9;  break;
                    case '5':  $s += 13;  break;
                    case '6':  $s += 15;  break;
                    case '7':  $s += 17;  break;
                    case '8':  $s += 19;  break;
                    case '9':  $s += 21;  break;
                    case 'A':  $s += 1;  break;
                    case 'B':  $s += 0;  break;
                    case 'C':  $s += 5;  break;
                    case 'D':  $s += 7;  break;
                    case 'E':  $s += 9;  break;
                    case 'F':  $s += 13;  break;
                    case 'G':  $s += 15;  break;
                    case 'H':  $s += 17;  break;
                    case 'I':  $s += 19;  break;
                    case 'J':  $s += 21;  break;
                    case 'K':  $s += 2;  break;
                    case 'L':  $s += 4;  break;
                    case 'M':  $s += 18;  break;
                    case 'N':  $s += 20;  break;
                    case 'O':  $s += 11;  break;
                    case 'P':  $s += 3;  break;
                    case 'Q':  $s += 6;  break;
                    case 'R':  $s += 8;  break;
                    case 'S':  $s += 12;  break;
                    case 'T':  $s += 14;  break;
                    case 'U':  $s += 16;  break;
                    case 'V':  $s += 10;  break;
                    case 'W':  $s += 22;  break;
                    case 'X':  $s += 25;  break;
                    case 'Y':  $s += 24;  break;
                    case 'Z':  $s += 23;  break;
                }
            }

            if( chr($s%26+ord('A'))!=$value[15] )
                return false;

            return true;

        });

        //validate vat number
        Validator::extend('vat_number', function($attribute, $value, $parameters, $validator) {
            if($value=='')
                return false;

            //la p.iva deve essere lunga 11 caratteri
            if(strlen($value)!=11)
                return false;

            //la p.iva deve avere solo cifre
            if(!@ereg("^[0-9]+$", $value))
                return false;

            $primo=0;
            for($i=0; $i<=9; $i+=2)
                $primo+= ord($value[$i])-ord('0');

            for($i=1; $i<=9; $i+=2 ){
                $secondo=2*( ord($value[$i])-ord('0') );

            if($secondo>9)
                $secondo=$secondo-9;
            $primo+=$secondo;

            }
            if( (10-$primo%10)%10 != ord($value[10])-ord('0') )
                return false;

            return true;        
        });
    }

}

0 个答案:

没有答案