2009-10-29 3 views
6

В настоящее время я работаю над PHP-приложением OO. У меня есть класс под названием validation, который я хотел бы использовать для проверки всех представленных данных, но мне, очевидно, нужно где-то определять правила для каждого проверяемого свойства. На данный момент я использую массивы при создании нового объекта. например:Проверка объекта PHP

$this->name = array(
'maxlength' => 10, 
'minlength' => 2, 
'required' => true, 
'value' => $namefromparameter 
) 

Один массив для каждого имущества.

Тогда я бы назвал статический метод из класса проверки, который выполнял бы различные проверки в зависимости от значений, определенных в каждом массиве.

Есть ли более эффективный способ сделать это? Любые советы оценены. Спасибо.

ответ

8

Я знаю, что ассоциативный массив используется, как правило, для настройки вещей в PHP (это называется шаблоном magic container и считается плохой практикой, кстати), но почему бы вам не создать несколько классов валидатора, каждый из которых способен обрабатывать один править? Что-то вроде этого:

interface IValidator { 
    public function validate($value); 
} 

$validators[] = new StringLengthValidator(2, 10); 
$validators[] = new NotNollValidator(); 
$validators[] = new UsernameDoesNotExistValidator(); 

Это имеет несколько преимуществ по сравнению с реализации с использованием массивов:

  • Вы можете документ их (очень важно), PHPDoc не может разобрать комментарии для ключей массива.
  • Ваш код становится опечатка-сейф (array('reqiured' => true))
  • Это полностью OO и не вводит новые понятия
  • Это более удобным для чтения (хотя и гораздо более подробно)
  • Реализация каждого ограничения можно найти интуитивно (это не функция в 400-линии, но в собственном классе)

EDIT: Вот link to an answer I gave к different question, но это в основном применимо к этому, а также.

+0

Хороший пункт там с документацией! –

+0

Спасибо, я раньше не слышал об интерфейсах. Я проверю их! – Dan

0

С использованием OO было бы более чистым, если бы вы использовали классы для проверки свойств. Например.

class StringProperty 
{ 
    public $maxLength; 
    public $minlength; 
    public $required; 
    public $value; 
    function __construct($value,$maxLength,$minLength,$required) 
    { 
    $this->value = $value; 
    $this-> maxLength = $maxLength; 
    $this-> minLength = $minLength; 
    $this-> required = $required; 
    } 
    function isValidat() 
    { 
    // Check if it is valid 
    } 
    function getValidationErrorMessage() 
    { 
    } 
} 

$this->name = new StringProperty($namefromparameter,10,2,true); 
if(!$this->name->isValid()) 
{ 
    $validationMessage = $this->name-getValidationErrorMessage(); 
} 

Использование класса имеет преимущество инкапсуляции логики внутри него, что массив (в основном структура) не имеет.

0

Возможно, получить вдохновение от Zend-Framework Validation.

Так определяют мастер:

class BaseValidator { 
    protected $msgs = array(); 
    protected $params = array();  

    abstract function isValid($value); 
    public function __CONSTRUCT($_params) { 
     $this->params = $_params; 
    } 
    public function getMessages() { 
     // returns errors-messages 
     return $this->msgs; 
    } 
} 

А потом строить свои собственные валидаторы:

class EmailValidator extends BaseValidator { 
    public function isValid($val=null) { 
     // if no value set use the params['value'] 
     if ($val==null) { 
      $val = $this->params['value']; 
     } 
     // validate the value 
     if (strlen($val) < $this->params['maxlength']) { 
      $this->msgs[] = 'Length too short'; 
     } 
     return count($this->msgs) > 0 ? false : true; 
    } 
} 

Наконец ваш Исходная массив может стать чем-то вроде:

$this->name = new EmailValidator(
     array(
      'maxlength' => 10, 
      'minlength' => 2, 
      'required' => true, 
      'value' => $namefromparameter, 
     ), 
    ), 
); 

проверка может затем быть сделано следующим образом:

if ($this->name->isValid()) { 
    echo 'everything fine'; 
} else { 
    echo 'Error: '.implode('<br/>', $this->name->getMessages()); 
} 
Смежные вопросы