Как практичнее выводить сообщения о невалидных данных?

Есть класс Validation. В конструктор передаются правила валидации. Я склоняюсь к такому варианту, но получается что ключ msg передается в сам метод валидации и приходится в каждом методе искать этот ключ и городить такие конструкции return (isset($options['msg']) ) ? $options['msg'] : false;
$validation = new Validation([
    'FieldName' => [
        'validateAs' => ['ValidateArg' => 'value', 'msg' => 'FieldsName in invalid.'] 
    ]
])

Нормальна ли такая реализация, или есть способы получше?
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Возвращайте в переменную (через return) ассоциативный массив (вместо объекта или значения):
'ValidationError'=>array(
  [0]=>array(
            'msg'=>'Переменная должна быть в диапазоне: 0-100',
            'FieldName'=>'percent',
            'FiledValue'=>150
          )
);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Думаю класс должен возвращать текст ошибки если она есть и пустоту есть ошибки нет, далее в модели или контроллере проверяется пустое сообщение об ошибке или нет и если нет то уже во вьюшке оно выводится на экран но полностью заранее подготовленное
Ответ написан
@thorii Автор вопроса
<?php
namespace System\Validation;

use System\Core;

class Validator {
	
	private $config;
	private $rules;
        private $error;




	public function __construct($rules) { // Для каждой формы, свой экземпляр (new Validator($rules))
		$this->config = Core::libraryConfig(__CLASS__);
                $this->rules = $rules;
	}
	
	public function isValid($data) {
        while(list($field, $value) = each($data)) {
            $rules = $this->rules[$field];
            foreach($rules as $rule => $options) {
                $method = 'validate'.$rule; //тут приписывается префикс
                $valid = $this->$method($value, $options); //@return true|false|string Error Message
                if($valid) {
                  return TRUE;
               } else return $valid; //Это ужасный кусок, это я тоже хочу в порядок привести. А может внутри метода записывать $this->error и вернуть false?
            }
        }
        return TRUE;
    }

    public function validateEmail($value, $options = []) {
        if(filter_var($value, FILTER_VALIDATE_EMAIL)) {
            return TRUE;
        } else return (isset($options['msg'])) ? $options['msg'] : FALSE; //Вот эти строки вечно дублируются
//Может просто вырезать ключ msg в методе валидации и работать уже там с сообщением??
    }

    public function validateRequired($value, $options = []) {
        if(!is_null($value) || !empty($value)) {
            return TRUE;
        } else return (isset($options['msg'])) ? $options['msg'] : FALSE; //Вот тут метод вернет сообщение если оно передано, иначе false соответственно
//Идет дублирование, разве он должен оперировать еще и сообщениями ошибок? Нет. А ума не хватает переделать
    }

}
?>

$validateRules = [
    'firstname' => [
     'required' => ['msg' => 'First name can\'t be empty']
    //Прочие валидаторы...
    ],
      'lastname' => [
      'required' => ['msg' => 'Lastname can\'t be empty']
    ]
];

$validator = new Validator($validateRules);
var_dump($validator->isValid(['firstname' => NULL]));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы