Basics

Doğrulama

Giriş

Nylo Website v7, FormValidator sınıfı etrafında oluşturulmuş bir doğrulama sistemi sunar. Sayfalarınızda check() metodunu kullanarak verileri doğrulayabilir veya bağımsız ve alan seviyesinde doğrulama için FormValidator'ı doğrudan kullanabilirsiniz.

// Validate data in a NyPage/NyState using check()
check((validate) {
  validate.that('user@example.com').email();
  validate.that('Anthony')
              .capitalized()
              .maxLength(50);
}, onSuccess: () {
  print("All validations passed!");
});

// FormValidator with form fields
Field.text("Email", validator: FormValidator.email())

check() ile Veri Doğrulama

Herhangi bir NyPage içinde veri doğrulamak için check() metodunu kullanın. Doğrulayıcı listesi alan bir callback kabul eder. Veri eklemek ve kuralları zincirlemek için .that() kullanın:

class _RegisterPageState extends NyPage<RegisterPage> {

  void handleForm() {
    check((validate) {
      validate.that(_emailController.text, label: "Email").email();
      validate.that(_passwordController.text, label: "Password")
          .notEmpty()
          .password(strength: 2);
    }, onSuccess: () {
      // Tüm doğrulamalar geçti
      _submitForm();
    }, onValidationError: (FormValidationResponseBag bag) {
      // Doğrulama başarısız
      print(bag.firstErrorMessage);
    });
  }
}

check() Nasıl Çalışır

  1. check() boş bir List<FormValidator> oluşturur
  2. Callback'iniz, listeye veriyle yeni bir FormValidator eklemek için .that(data) kullanır
  3. Her .that(), kuralları zincirleme olarak ekleyebileceğiniz bir FormValidator döndürür
  4. Callback'ten sonra, listedeki her doğrulayıcı kontrol edilir
  5. Sonuçlar bir FormValidationResponseBag içinde toplanır

Birden Fazla Alanı Doğrulama

check((validate) {
  validate.that(_nameController.text, label: "Name").notEmpty().capitalized();
  validate.that(_emailController.text, label: "Email").email();
  validate.that(_phoneController.text, label: "Phone").phoneNumberUs();
  validate.that(_ageController.text, label: "Age").numeric().minValue(18);
}, onSuccess: () {
  _submitForm();
});

İsteğe bağlı label parametresi, hata mesajlarında kullanılan insan tarafından okunabilir bir ad ayarlar (örn. "The Email must be a valid email address.").

Doğrulama Sonuçları

check() metodu bir FormValidationResponseBag (List<FormValidationResult>) döndürür ve bunu doğrudan inceleyebilirsiniz:

FormValidationResponseBag bag = check((validate) {
  validate.that(_emailController.text, label: "Email").email();
  validate.that(_passwordController.text, label: "Password")
      .password(strength: 1);
});

if (bag.isValid) {
  print("All valid!");
} else {
  // İlk hata mesajını al
  String? error = bag.firstErrorMessage;
  print(error);

  // Başarısız tüm sonuçları al
  List<FormValidationResult> errors = bag.validationErrors;

  // Başarılı tüm sonuçları al
  List<FormValidationResult> successes = bag.validationSuccess;
}

FormValidationResult

Her FormValidationResult, tek bir değerin doğrulanmasının sonucunu temsil eder:

FormValidator validator = FormValidator(data: "test@email.com")
    .email()
    .maxLength(50);

FormValidationResult result = validator.check();

if (result.isValid) {
  print("Valid!");
} else {
  // İlk hata mesajı
  String? message = result.getFirstErrorMessage();

  // Tüm hata mesajları
  List<String> messages = result.errorMessages();

  // Hata yanıtları
  List<FormValidationError> errors = result.errorResponses;
}

FormValidator Kullanımı

FormValidator bağımsız olarak veya form alanlarıyla birlikte kullanılabilir.

Bağımsız Kullanım

// Adlandırılmış yapıcı kullanarak
FormValidator validator = FormValidator.email();
FormValidationResult result = validator.check("user@example.com");

if (result.isValid) {
  print("Email is valid");
} else {
  String? errorMessage = result.getFirstErrorMessage();
  print("Error: $errorMessage");
}

Yapıcıda Veri ile

FormValidator validator = FormValidator(data: "user@example.com", attribute: "Email")
    .email()
    .maxLength(50);

FormValidationResult result = validator.check();
print(result.isValid); // true

FormValidator Adlandırılmış Yapıcılar

Nylo Website v7, yaygın doğrulamalar için adlandırılmış yapıcılar sunar:

// E-posta doğrulama
FormValidator.email(message: "Please enter a valid email")

// Parola doğrulama (güç 1 veya 2)
FormValidator.password(strength: 1)
FormValidator.password(strength: 2, message: "Password too weak")

// Telefon numaraları
FormValidator.phoneNumberUk()
FormValidator.phoneNumberUs()

// URL doğrulama
FormValidator.url()

// Uzunluk kısıtlamaları
FormValidator.minLength(5, message: "Too short")
FormValidator.maxLength(100, message: "Too long")

// Değer kısıtlamaları
FormValidator.minValue(18, message: "Must be 18+")
FormValidator.maxValue(100)

// Boyut kısıtlamaları (listeler/dizeler için)
FormValidator.minSize(2, message: "Select at least 2")
FormValidator.maxSize(5)

// Boş olmama
FormValidator.notEmpty(message: "This field is required")

// Değer içerme
FormValidator.contains(['option1', 'option2'])

// Başlangıç/bitiş ile
FormValidator.beginsWith("https://")
FormValidator.endsWith(".com")

// Boolean kontrolleri
FormValidator.booleanTrue(message: "Must accept terms")
FormValidator.booleanFalse()

// Sayısal
FormValidator.numeric()

// Tarih doğrulamaları
FormValidator.date()
FormValidator.dateInPast()
FormValidator.dateInFuture()
FormValidator.dateAgeIsOlder(18, message: "Must be 18+")
FormValidator.dateAgeIsYounger(65)

// Metin büyük/küçük harf
FormValidator.uppercase()
FormValidator.lowercase()
FormValidator.capitalized()

// Konum formatları
FormValidator.zipcodeUs()
FormValidator.postcodeUk()

// Regex deseni
FormValidator.regex(r'^[A-Z]{3}\d{4}$', message: "Invalid format")

// Özel doğrulama
FormValidator.custom(
  message: "Invalid value",
  validate: (data) => data != null,
)

Doğrulama Kurallarını Zincirleme

Örnek metotları kullanarak birden fazla kuralı akıcı şekilde zincirleyin. Her metot FormValidator döndürür ve kuralları biriktirmenize olanak tanır:

FormValidator validator = FormValidator()
    .notEmpty()
    .email()
    .maxLength(50);

FormValidationResult result = validator.check("user@example.com");

if (!result.isValid) {
  List<String> errors = result.errorMessages();
  print(errors);
}

Tüm adlandırılmış yapıcıların karşılık gelen zincirleme örnek metotları vardır:

FormValidator()
    .notEmpty(message: "Required")
    .email(message: "Invalid email")
    .minLength(5, message: "Too short")
    .maxLength(100, message: "Too long")
    .beginsWith("user", message: "Must start with 'user'")
    .lowercase(message: "Must be lowercase")

Özel Doğrulama

Özel Kural (Satır İçi)

Satır içi doğrulama mantığı eklemek için .custom() kullanın:

FormValidator.custom(
  message: "Username already taken",
  validate: (data) {
    // Geçerliyse true, geçersizse false döndürün
    return !_takenUsernames.contains(data);
  },
)

Veya diğer kurallarla zincirleyin:

FormValidator()
    .notEmpty()
    .custom(
      message: "Must start with a letter",
      validate: (data) => RegExp(r'^[a-zA-Z]').hasMatch(data.toString()),
    )

Eşitlik Doğrulaması

Bir değerin başka bir değerle eşleşip eşleşmediğini kontrol edin:

FormValidator()
    .notEmpty()
    .equals(
      _passwordController.text,
      message: "Passwords must match",
    )

FormValidator'ı Alanlarla Kullanma

FormValidator, formlardaki Field widget'larıyla entegre olur. validator parametresine bir doğrulayıcı geçirin:

class RegisterForm extends NyFormData {
  RegisterForm({String? name}) : super(name ?? "register");

  @override
  fields() => [
        Field.text(
          "Name",
          autofocus: true,
          validator: FormValidator.notEmpty(),
        ),
        Field.email("Email", validator: FormValidator.email()),
        Field.password(
          "Password",
          validator: FormValidator.password(strength: 1),
        ),
      ];
}

Alanlarla zincirleme doğrulayıcılar da kullanabilirsiniz:

Field.text(
  "Username",
  validator: FormValidator()
      .notEmpty(message: "Username is required")
      .minLength(3, message: "At least 3 characters")
      .maxLength(20, message: "At most 20 characters"),
)

Field.slider(
  "Rating",
  validator: FormValidator.minValue(4, message: "Rating must be at least 4"),
)

Mevcut Doğrulama Kuralları

FormValidator için hem adlandırılmış yapıcılar hem de zincirleme metotlar olarak mevcut tüm kurallar:

Kural Adlandırılmış Yapıcı Zincirleme Metot Açıklama
Email FormValidator.email() .email() E-posta formatını doğrular
Password FormValidator.password(strength: 1) .password(strength: 1) Güç 1: 8+ karakter, 1 büyük harf, 1 rakam. Güç 2: + 1 özel karakter
Not Empty FormValidator.notEmpty() .notEmpty() Boş olamaz
Min Length FormValidator.minLength(5) .minLength(5) Minimum dize uzunluğu
Max Length FormValidator.maxLength(100) .maxLength(100) Maksimum dize uzunluğu
Min Value FormValidator.minValue(18) .minValue(18) Minimum sayısal değer (dize uzunluğu, liste uzunluğu, map uzunluğu için de çalışır)
Max Value FormValidator.maxValue(100) .maxValue(100) Maksimum sayısal değer
Min Size FormValidator.minSize(2) .minSize(2) Listeler/dizeler için minimum boyut
Max Size FormValidator.maxSize(5) .maxSize(5) Listeler/dizeler için maksimum boyut
Contains FormValidator.contains(['a', 'b']) .contains(['a', 'b']) Değer verilen değerlerden birini içermelidir
Begins With FormValidator.beginsWith("https://") .beginsWith("https://") Dize önekle başlamalıdır
Ends With FormValidator.endsWith(".com") .endsWith(".com") Dize sonekle bitmelidir
URL FormValidator.url() .url() URL formatını doğrular
Numeric FormValidator.numeric() .numeric() Sayı olmalıdır
Boolean True FormValidator.booleanTrue() .booleanTrue() true olmalıdır
Boolean False FormValidator.booleanFalse() .booleanFalse() false olmalıdır
Date FormValidator.date() .date() Geçerli bir tarih olmalıdır
Date In Past FormValidator.dateInPast() .dateInPast() Tarih geçmişte olmalıdır
Date In Future FormValidator.dateInFuture() .dateInFuture() Tarih gelecekte olmalıdır
Age Is Older FormValidator.dateAgeIsOlder(18) .dateAgeIsOlder(18) Yaş N'den büyük olmalıdır
Age Is Younger FormValidator.dateAgeIsYounger(65) .dateAgeIsYounger(65) Yaş N'den küçük olmalıdır
Capitalized FormValidator.capitalized() .capitalized() İlk harf büyük olmalıdır
Lowercase FormValidator.lowercase() .lowercase() Tüm karakterler küçük harf olmalıdır
Uppercase FormValidator.uppercase() .uppercase() Tüm karakterler büyük harf olmalıdır
Phone US FormValidator.phoneNumberUs() .phoneNumberUs() ABD telefon numarası formatı
Phone UK FormValidator.phoneNumberUk() .phoneNumberUk() Birleşik Krallık telefon numarası formatı
Zipcode US FormValidator.zipcodeUs() .zipcodeUs() ABD posta kodu formatı
Postcode UK FormValidator.postcodeUk() .postcodeUk() Birleşik Krallık posta kodu formatı
Regex FormValidator.regex(r'pattern') .regex(r'pattern') Regex deseniyle eşleşmelidir
Equals .equals(otherValue) Başka bir değere eşit olmalıdır
Custom FormValidator.custom(validate: fn) .custom(validate: fn) Özel doğrulama fonksiyonu

Tüm kurallar, hata mesajını özelleştirmek için isteğe bağlı bir message parametresi kabul eder.

Özel Doğrulama Kuralları Oluşturma

Yeniden kullanılabilir bir doğrulama kuralı oluşturmak için FormRule sınıfını genişletin:

class FormRuleUsername extends FormRule {
  @override
  String? rule = "username";

  @override
  String? message = "The {{attribute}} must be a valid username.";

  FormRuleUsername({String? message}) {
    if (message != null) {
      this.message = message;
    }
  }

  @override
  bool validate(data) {
    if (data is! String) return false;
    // Kullanıcı adı: alfasayısal, alt çizgi, 3-20 karakter
    return RegExp(r'^[a-zA-Z0-9_]{3,20}$').hasMatch(data);
  }
}

message içinde yer tutucu olarak {{attribute}} kullanın - çalışma zamanında alanın etiketiyle değiştirilecektir.

Özel FormRule Kullanımı

Özel kuralınızı FormValidator.rule() kullanarak bir FormValidator'a ekleyin:

FormValidator validator = FormValidator.rule([
  FormRuleNotEmpty(),
  FormRuleUsername(),
]);

FormValidationResult result = validator.check("my_username");

Veya sınıf oluşturmadan tek seferlik kurallar için .custom() metodunu kullanın:

FormValidator()
    .notEmpty()
    .custom(
      message: "Username must start with a letter",
      validate: (data) => RegExp(r'^[a-zA-Z]').hasMatch(data.toString()),
    )