2009-10-29 38 views
6

Tôi hiện đang làm việc trên một ứng dụng PHP OO. Tôi có một lớp được gọi là xác nhận mà tôi muốn sử dụng để kiểm tra tất cả các dữ liệu được gửi là hợp lệ, tuy nhiên tôi rõ ràng cần một nơi nào đó để xác định các quy tắc cho mỗi thuộc tính được kiểm tra. Tại thời điểm này, tôi đang sử dụng mảng trong khi xây dựng một đối tượng mới. ví dụ:Xác thực đối tượng PHP

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

Một mảng cho mỗi thuộc tính.

Sau đó tôi sẽ gọi một phương thức tĩnh từ lớp xác thực sẽ thực hiện các kiểm tra khác nhau tùy thuộc vào các giá trị được xác định trong mỗi mảng.

Có cách nào hiệu quả hơn để thực hiện việc này không? Bất kỳ lời khuyên nào được đánh giá cao. Cảm ơn.

Trả lời

8

Tôi biết mảng kết hợp thường được sử dụng để định cấu hình mọi thứ trong PHP (gọi là magic container và được coi là thực hành không tốt, btw), nhưng tại sao bạn không tạo nhiều lớp trình xác thực thay thế. qui định? Một cái gì đó như thế này:

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

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

này có nhiều ưu điểm so với việc thực hiện sử dụng các mảng:

  • Bạn có thể tài liệu họ (rất quan trọng), PHPDoc không thể phân tích ý kiến ​​cho các phím mảng.
  • Mã của bạn trở nên typo-an toàn (array('reqiured' => true))
  • Nó hoàn toàn OO và không giới thiệu khái niệm mới
  • Nó là dễ đọc hơn (mặc dù nhiều hơn nữa verbose)
  • Việc thực hiện của mỗi hạn chế có thể được tìm thấy bằng trực giác (nó không phải trong một chức năng 400 dòng, nhưng trong lớp thích hợp)

EDIT: đây là một link to an answer I gave đến một different question, nhưng đó là chủ yếu áp dụng đối với một trong này là tốt.

+0

Điểm tốt ở đó với tài liệu! –

+0

Cảm ơn, tôi đã không nghe nói về giao diện trước đây. Tôi sẽ kiểm tra chúng! – Dan

0

Vì sử dụng OO, nó sẽ sạch hơn nếu bạn sử dụng các lớp để xác thực các thuộc tính. Ví dụ.

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

Sử dụng lớp học có lợi thế là đóng gói logic bên trong mảng mà về cơ bản là cấu trúc không có.

0

Có thể lấy cảm hứng từ Zend-Framework Validation.

Vì vậy, xác định một bậc thầy:

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

Và sau đó xây dựng xác nhận tùy chỉnh của bạn:

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

Cuối cùng mảng inital của bạn có thể trở thành một cái gì đó như:

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

xác nhận sau đó có thể là thực hiện như sau:

if ($this->name->isValid()) { 
    echo 'everything fine'; 
} else { 
    echo 'Error: '.implode('<br/>', $this->name->getMessages()); 
} 
Các vấn đề liên quan