Вывод ошибок. Валидация формы? Приветствую. Пишу валидацию есть вопросы! Хочется написать красиво, но не получается выводить ошибки. Давайте так я скину пример и ниже опишу в чём суть. Вот кусок кода:class UserController { /** * Action для страницы "Регистрация" */ public function actionRegister() { // Переменные для формы $login = false; $email = false; $password = false; $result = false; // Обработка формы if (isset($_POST['submit'])) { // Если форма отправлена // Получаем данные из формы $login = $_POST['login']; $email = $_POST['email']; $password = $_POST['password']; // Флаг ошибок $errors = false; // Валидация полей if (!User::checkName($login)) { $errors[] = 'Имя не должно быть короче 2-х символов'; } if (!User::checkEmail($email)) { $errors[] = 'Неправильный email'; } if (!User::checkPassword($password)) { $errors[] = 'Пароль не должен быть короче 6-ти символов'; } if (User::checkEmailExists($email)) { $errors[] = 'Такой email уже используется'; } if ($errors == false) { //генерируем соль $salt = User::generateCode(5);
//получает хеш-сумму пароля и соли $password = md5($password.$salt);
// Если ошибок нет // Регистрируем пользователя User::register($login, $email, $password, $salt); header("Location: /"); } } // Подключаем вид require_once(VIEW . '/user/register.php'); return true; } } После нажатия кнопки формы данные проходят валидацию. Если какое либо поле не проходит проверку то в массив $errors = false;попадает значение ну допустим это $errors[] = 'Имя не должно быть короче 2-х символов'; Данная функция которая проверяет длину строки находится в моделе User и имеет вид:/** * Проверяет имя: не меньше, чем 2 символа */ public static function checkName($login) { if ($login >= 2) { return true; } return false; } Я хочу проверять не только длину строки но и скажем чтобы были только латинские буквы и кроме этого отсечь все цифры подчёркивания и прочее. Я хочу чтобы моя функция была не в одну строку, должна выводить предупреждения чтобы логин состоял из латинских символов и был не короче 2-х символов. По сути функция должна иметь такой вид:public static function checkName($login) { if(!preg_match("/^[a-zA-Z]{1,20}$/"), $login){ $errors[] = 'Логин должен быть из латинских символов и не более 20 символов'; }elseif(!$login >= 2){ $errors[] = 'Логин не должен быть короче 2-х символов'; }else{ return true; } } Когда я писал красиво имелось введу вот это(то что находится в экшене):if (!User::checkName($login)) { $errors[] = 'Имя не должно быть короче 2-х символов'; } Тут с выводом ошибок проблем нет. Хочется чтобы валидация логина была одной функцией, но у меня не получается из модели передать ошибки в массив $errors[] который находится в контроллере =) UserController Вот что делать кинуть этот код в контроллер? Ну будет же некрасиво... Подскажите как быть? Я постарался максимально подробно описать чего я хочу. Ну насколько подробно у меня это вышло. =)
Для того чтобы передавать ошибки из модели в контроллер, можно использовать возвращение массива ошибок из функции в модели. Например, вместо того чтобы просто возвращать true или false, функция в модели может возвращать массив ошибок, если они есть.
Примерно так:
public static function checkName($login) { $errors = array(); if (!preg_match("/^[a-zA-Z]{1,20}$/", $login)) { $errors[] = 'Логин должен состоять из латинских символов и быть не более 20 символов'; } if (strlen($login) < 2) { $errors[] = 'Логин не должен быть короче 2-х символов'; } return $errors; }
И в контроллере можно принимать этот массив ошибок и добавлять его к основному массиву $errors для дальнейшего вывода.
Примерно так:
$errors = array(); // Валидация полей $nameErrors = User::checkName($login); if (!empty($nameErrors)) { $errors = array_merge($errors, $nameErrors); } // Проверка остальных полей и добавление ошибок в массив $errors if (!empty($errors)) { // Обработка ошибок } else { // Регистрация пользователя }
Таким образом, вы сможете передавать ошибки из модели в контроллер и выводить их при необходимости.
Для того чтобы передавать ошибки из модели в контроллер, можно использовать возвращение массива ошибок из функции в модели. Например, вместо того чтобы просто возвращать true или false, функция в модели может возвращать массив ошибок, если они есть.
Примерно так:
public static function checkName($login){
$errors = array();
if (!preg_match("/^[a-zA-Z]{1,20}$/", $login)) {
$errors[] = 'Логин должен состоять из латинских символов и быть не более 20 символов';
}
if (strlen($login) < 2) {
$errors[] = 'Логин не должен быть короче 2-х символов';
}
return $errors;
}
И в контроллере можно принимать этот массив ошибок и добавлять его к основному массиву $errors для дальнейшего вывода.
Примерно так:
$errors = array();// Валидация полей
$nameErrors = User::checkName($login);
if (!empty($nameErrors)) {
$errors = array_merge($errors, $nameErrors);
}
// Проверка остальных полей и добавление ошибок в массив $errors
if (!empty($errors)) {
// Обработка ошибок
} else {
// Регистрация пользователя
}
Таким образом, вы сможете передавать ошибки из модели в контроллер и выводить их при необходимости.