Проверка объектов PHP - PullRequest
       20

Проверка объектов PHP

6 голосов
/ 29 октября 2009

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 29 октября 2009

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

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

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

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

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

РЕДАКТИРОВАТЬ : Вот ссылка на ответ, который я дал на другой вопрос , но это в основном относится и к этому.

0 голосов
/ 29 октября 2009

Возможно, вас вдохновит Проверка Zend-Framework .

Итак, определите мастера:

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());
}
0 голосов
/ 29 октября 2009

Поскольку использование 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();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...