2009-10-29 10 views
6

मैं वर्तमान में ओओ PHP एप्लिकेशन पर काम कर रहा हूं। मेरे पास सत्यापन नामक एक वर्ग है जिसे मैं सबमिट करने के लिए उपयोग करना चाहता हूं, सभी डेटा को वैध है, हालांकि मुझे स्पष्ट रूप से प्रत्येक संपत्ति की जांच के नियमों को परिभाषित करने के लिए कहीं और चाहिए। फिलहाल, मैं एक नई वस्तु के निर्माण के दौरान सरणी का उपयोग कर रहा हूं। उदाहरण: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 लाइन समारोह में नहीं है, लेकिन उचित कक्षा में)

संपादित: यहाँ एक different question करने के लिए एक link to an answer I gave है, लेकिन उस के साथ-साथ ज्यादातर इस एक के लिए लागू है।

+0

दस्तावेज़ीकरण के साथ अच्छा बिंदु! –

+0

धन्यवाद, मैंने पहले इंटरफेस के बारे में नहीं सुना था। मैं उन्हें देख लूंगा! – Dan

0

ओओ का उपयोग करने के बाद से यदि आप गुणों को मान्य करने के लिए कक्षाओं का उपयोग करते हैं तो यह क्लीनर होगा। जैसे

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

कक्षा का उपयोग करके इसके अंदर तर्क को encapsulating का लाभ है कि सरणी (मूल रूप से एक संरचना) नहीं है।

0

शायद Zend-Framework Validation से प्रेरित हो जाएं।

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

मान्यता तो हो सकता है: की तरह कुछ

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

अंत में अपने inital सरणी बन सकता है:

तो एक मास्टर को परिभाषित:

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

और फिर अपने कस्टम प्रमाणकों के निर्माण इस तरह किया गया:

if ($this->name->isValid()) { 
    echo 'everything fine'; 
} else { 
    echo 'Error: '.implode('<br/>', $this->name->getMessages()); 
} 
संबंधित मुद्दे