2013-05-21 57 views
1

我想在我工作的網站上實現驗證功能。PHP多個接口來實現驗證功能?

我已經創建了一個名爲接口驗證該我的班,然後執行。我的界面中的單個函數是validate($ input)。

然後,我有一個類e.g爲EmailValidator現在實現了這個。在它的validate()實現中,它檢查輸入是否是有效的電子郵件,並分別返回true或false。

現在..我想實現一個檢查,其中兩個輸入被髮送,我檢查,如果他們是平等的。例如在密碼的情況下。由於這個接口函數只需要一個輸入,所以不適合。

我可以創建一個validate函數,它接受兩個輸入e.g PairValidator的第二接口。然而,這是實現我想要的最佳方式嗎?

我擔心的出現,因爲由於驗證功能的可能性,我可能需要我可以振振有詞有接口如setValidator將用於檢查一個值是否在一組負載..

感謝

+0

您可以在該類中創建未在接口中聲明的方法。 –

+0

我不認爲接口實現是這裏的答案。考慮只有一個實用的Validator類,它具有驗證不同字段類型的方法。 –

+0

你可以做的只是提供多個值來驗證驗證器爲數組,如'$ validator-> validate(array(「val1」=>「Test」,「val2」=>「Test2」);' – Orangepill

回答

0

我已經解決同樣的問題與以下接口方法:

public function isValid($value, array $values = array()); 

$values具有所有表單域作爲關聯數組可用。因此,如果需要,您可以使用這些值。

我等於驗證的樣子:

class Equal implements IValidator 
{ 
    private $_varname = null; 

    public function __construct($varname) 
    { 
     $this->_varname = $varname; 
    } 

    public function isValid($value, array $values = array()) 
    { 
     if (!array_key_exists($this->_varname, $values)) { 
      // set error message 
      return false; 
     } 

     $otherValue = $values[$this->_varname]; 

     if ($value != $otherValue) { 
      // set error message 
      return false; 
     } 
     return true; 
    } 
} 

所以我設置在構造要檢查的其他形式的關鍵。

+0

有趣的。如果我想重用該類的實例只需添加一個setter方法,所以我可以更改$ _varname? 同樣爲了檢查一個值是否在一個集合中,你是否建議使用完全相同的方法,以便在構造函數中設置set數組,然後在函數中對它進行驗證? –

+0

是的......的確如此,這是我的InArray驗證程序的工作原理。如果你喜歡,你可以爲私有領域做一個setter,但我沒有必要重用一個驗證器實例。我不喜歡它,因爲如果你有接口中沒有聲明的方法,那麼接口沒什麼意義。 – bitWorking

1

有一對夫婦的方式,你可以用這個去。一到幾個簡單的將不會打破當前的接口定義是:

1)當前需要驗證作爲數組什麼。

$validator->validate($_POST["password"],$_POST["password_repeat"]); 

2)使用您需要的值之一構造驗證器。你可以這樣做會破壞當前的界面,需要改變你現在有任何驗證

$validator = new ValidateEquals($_POST["password"]); 
$validator->validate($_POST["password_repeat"]); 

一個辦法是從接口定義完全消除參數,並使用通過func_get_args位置參數

interface Validator { 
    public function validate(); 
} 

class EqualsValidator implements Validator { 
    public function validate(){ 
     $args = func_get_args(); 
     return $args[0] == $args[1]; 
    } 
} 
+0

海事組織,第二個建議是最好的。這樣,每當驗證規則發生變化時,您都不需要搞亂界面。 –

+0

這一切都取決於驗證器是否以靜態方式使用,然後版本2不在。第3版是最靈活的,但是你失去了大量的編譯時間檢查。 – Orangepill

+0

「靜態意義上的」是什麼意思? –