PHP Nesne Doğrulama

3 Cevap php

Şu anda bir OO PHP uygulama üzerinde çalışıyorum. Ancak ben açıkçası kontrol edilmesi her özellik için kurallar tanımlamak için bir yere ihtiyacım var, sunulan tüm verileri kontrol etmek için kullanmak istiyorum doğrulama denilen bir sınıf geçerlidir var. Şu anda, ben yeni bir nesne inşası sırasında diziler kullanıyorum. örneğin:

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

Her özellik için bir dizi.

Ben sonra her dizide tanımlanan değerlere bağlı olarak çeşitli kontroller yürütmek hangi doğrulama sınıfı statik bir yöntem çağırır.

Is there a more efficient way of doing this? Any advice appreciated. Thanks.

3 Cevap

Ben ilişkisel dizi (btw, magic container desen denir ve kötü bir uygulama olarak kabul edilir) PHP şeyler yapılandırmak için yaygın olarak kullanılır biliyorum, ama neden mümkün olan her yerine, birden fazla validator sınıfları oluşturmak yok bir kural ele? Böyle bir şey:

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

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

Bu diziler kullanarak uygulama üzerinde birden çok avantajları vardır:

  • Sen document onları (çok önemli), phpdoc dizi anahtarları için yorum ayrıştırmak yapamazsınız.
  • Sizin kod yazım hatası-güvenli hale gelir (array('reqiured' => true))
  • Bu tamamen OO ve yeni kavramları tanıtmak değil
  • (Çok daha ayrıntılı rağmen) daha okunaklı
  • Her kısıtın uygulaması (bir 400-çizgi fonksiyonu değil, ama uygun sınıfında) sezgisel bulunabilir

EDIT, burada a link to an answer I gave, bir different question ile, ancak bu aynı zamanda bu bir çok uygulanabilir.

Ö.Ö. kullanarak beri bu özelliklerini doğrulanması için sınıflar kullanılırsa temiz olurdu. Örneğin

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

Bir sınıf kullanarak array (temelde bir yapı) yok bunun içinde mantık kapsül avantajına sahiptir.

Belki Zend-Framework Validation ilham olsun.

Yani bir ana tanımlar:

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

Ve sonra özel denetleyiciler oluşturmak:

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

Son olarak açmasının dizi gibi bir şey haline gelebilir:

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

doğrulama sonra bu gibi yapılabilir:

if ($this->name->isValid()) {
    echo 'everything fine';
} else {
    echo 'Error: '.implode('<br/>', $this->name->getMessages());
}