輸入驗證是一種業務邏輯,因此我們應該將這個程序隱藏在領域層中。如此處所討論
我這樣做
登錄驗證器
class LoginValidator extends Validator {
String email;
String password;
LoginValidator(this.email, this.password);
@override
void validate(Function() success, Function(List<Failure>) errors) {
List<Failure> failures = [];
if (email.trim().isEmpty) {
failures.add(const EmailValidationFailure('Email is required'));
} else if (!validator.isEmail(email)) {
failures.add(const EmailValidationFailure());
}
if (password.trim().isEmpty) {
failures.add(const PasswordValidationFailure('Password is required'));
}
if (failures.isNotEmpty) {
errors(failures);
} else {
success();
}
}
}
我為每個輸入欄位創建了一個失敗類
class EmailValidationFailure extends Failure {
const EmailValidationFailure([String message = 'Email is invalid'])
: super(message);
}
class PasswordValidationFailure extends Failure {
const PasswordValidationFailure([String message = 'Incorrect password'])
: super(message);
}
我在用例中使用驗證器
class LoginUseCaseInteractor implements LoginUseCaseInputPort {
final AccountRepository _repository;
final LoginUseCaseOutputPort outputPort;
LoginUseCaseInteractor(this._repository, this.outputPort);
@override
void login(LoginParams params) {
LoginValidator(params.email, params.password).validate(() async {
outputPort.loading();
Result<bool> result = await _repository.login(params);
result.when(
success: (data) {
outputPort.success();
},
error: (error) {
outputPort.requestError(error);
},
);
}, (errors) {
outputPort.formValidationErrors(errors);
});
}
}
最后我在演示器中處理演示邏輯,它實作了登錄用例的輸出埠
class LoginPresenter implements LoginUseCaseOutputPort {
Reader read;
LoginPresenter(this.read) : super(LoginState.initial());
@override
void formValidationErrors(List<Failure> errors) =>
state = LoginState.formValidationErrors(errors);
@override
void success() => read(setRootPresenterProvider.notifier).setMainPageAsRoot();
@override
void loading() => state = LoginState.loading();
@override
void requestError(Failure error) => state = LoginState.requestError(error);
}
我做什么我 為每個輸入欄位創建一個失敗類并回傳串列中所有欄位的失敗,在表示邏輯中我按型別檢查輸入失敗
我的問題: 如果我有一個大表單(例如:15 個欄位),我應該為每個表單創建一個失敗類嗎?有沒有更好的方法來處理驗證?
uj5u.com熱心網友回復:
我的問題:如果我有一個大表單(例如:15 個欄位),我應該為每個表單創建一個失敗類嗎?有沒有更好的方法來處理驗證?
每個可能發生的錯誤都必須是可識別的。通過專用類、故障代碼或常量。您選擇哪一個取決于您要提供給客戶端的錯誤背景關系資訊。
我也不會將訊息放入失敗物件中,因為由演示者選擇錯誤型別的演示文稿。向用戶呈現錯誤的方式很大程度上取決于用戶界面。也許錯誤不需要字串,它只是顯示為圖示或彩色標記等。互動者不應創建特定于語言的字串。這是用戶界面的一部分。
在簡單的情況下,您可能只需要一個錯誤代碼或常量401,然后演示者將其轉換為Login failed. 當然,您也可以在這種情況下使用常見的錯誤物件。
類失敗{ int代碼; }
在其他情況下,您可能希望顯示更詳細的錯誤訊息,例如E-mails under the domain '@somedomain.com' are not allowed to login.. 在這種情況下,您應該使用錯誤物件而不是簡單的代碼來提供詳細資訊。例如
類 LoginDomainFailure { String localPart; 字串域名 }
然后,演示者可以使用此資訊生成失敗字串或以其他方式顯示錯誤,例如在輸入欄位中突出顯示域名或您可以想象的任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425401.html
