В рекомендациях MVC говорится, что модель должна обрабатывать ввод / проверку данных. Допустим, у нас есть модель, которая создает новые учетные записи пользователей со следующими полями и ограничениями:
Username - not null, not already in DB
Password - not null, alphanumeric only
E-mail - not null, not already in DB, valid e-mail format
У нас есть AccountModel
с функцией CreateNewUser()
:
component
{
public void function CreateNewUser(string username, string password, string email)
{
// create account
}
}
Затем у нас есть контроллер, который обрабатывает сообщение формы и сообщает модели для создания учетной записи:
component
{
public void function NewUser()
{
var username = event.getValue("username");
var password = event.getValue("password");
var email = event.getValue("email");
var accountModel = new AccountModel();
accountModel.CreateNewUser(username, password, email);
event.addResult("UserCreated");
}
Теперь я хочу добавить проверку. Если пользователь не может ввести данные для всех трех полей, приложение должно показать пользователю три сообщения об ошибках проверки. Это достаточно просто сделать в контроллере:
// assumes that ValidateInput() is a function on the controller that returns an array
var validationErrors = ValidateInput(username, password, email);
// if there were any validation errors, return a ValidationError result
if (len(validationErrors)
{
event.setValue("validationerrors", validationErrors);
event.addResult("ValidationError");
}
else
{
event.addResult("UserCreated");
}
И представление извлечет переменную validationerrors и отобразит сообщения об ошибках.
Однако эта логика должна находиться в модели. Как мне это сделать? Я могу придумать два пути:
Метод 1: Перемещение ValidateInput()
от контроллера к модели. Теперь контроллер должен сначала вызвать ValidateInput()
до CreateNewUser()
. Если программист забудет это сделать, CreateNewUser()
выдаст исключение проверки. Недостатком этого является то, что теперь для каждой операции с данными, требующей проверки, потребуется блок if / else.
Метод 2: Откажитесь от необходимости звонить ValidateInput()
и просто позвоните CreateNewUser()
напрямую. Если были какие-либо ошибки проверки, будет выдано исключение, которое будет содержать массив сообщений об ошибках. Этот метод будет работать в C #, но похоже, что ColdFusion не поддерживает возврат данных с исключением, только сообщение об исключении и его тип. Кроме того, каждая операция с данными потребует блока try / catch.
Метод 3: ??
Как бы вы справились с проверкой в этом случае? Является ли метод 1 тем, что делает большинство людей, когда дело доходит до проверки в модели? Или люди обычно используют метод 2? Или есть метод 3, о котором я не думаю?