PHP对象验证

时间:2009-10-29 08:34:35

标签: php validation object

我目前正在开发一个OO PHP应用程序。我有一个名为validation的类,我想用它来检查提交的所有数据是否有效,但是我显然需要在某处定义要检查的每个属性的规则。目前,我正在构建一个新对象时使用数组。例如:

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

每个属性都有一个数组。

然后我会从验证类中调用一个静态方法,该方法将根据每个数组中定义的值执行各种检查。

有更有效的方法吗? 任何建议表示赞赏 感谢。

3 个答案:

答案 0 :(得分: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行函数中,而是在适当的类中)

编辑:这是link to an answer I gavedifferent question,但这也适用于此。

答案 1 :(得分:0)

由于使用OO,因此使用类来验证属性会更清晰。 E.g。

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();
}

使用类具有将逻辑封装在其中的数组(基本上是结构)所没有的优点。

答案 2 :(得分: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());
}