2011-02-08 51 views
0

我該如何處理方法的輸入驗證?
這兩個,哪一個更正確?或者有更好的辦法
這個方法被構造函數調用,$ prodID可以是用戶輸入或來自db。方法屬性輸入驗證

private function fill_data1($prodID) 
{ 
    //Way 1 
    filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000))); 
    if (is_null($prodID)) { 
     return FALSE; 
    } elseif ($prodID === FALSE) { 
     return FALSE; 
    } 
    $prod = getArtData($prodID); 
    $this->set_id($prod['artID']); 
    $this->set_name($prod['artName']); 
    $this->set_price($prod['precio']); 
} 

private function fill_data(2$prodID) 
{ 
    //Way 2 
    filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000))); 
    if (is_null($prodID) || $prodID === FALSE) 
    { 
     die('invalid input for prodID (' . $prodID . '). It has to be an integer > 0'); 
    } 
    $prod = getArtData($prodID); 
    $this->set_id($prod['artID']); 
    $this->set_name($prod['artName']); 
    $this->set_price($prod['precio']); 
} 

回答

1

選項3:使用例外並將ID驗證儘可能靠近數據。

public function getArtData($id) { 
    if (!is_int($id) || $id <= 0) { 
     throw new InvalidIdentifierException(
       "Article ID $id must be a valid, positive integer."); 
    } 
    ... 
} 

與返回的false的問題是,你必須檢查返回值來處理跳過它。如果你在哪裏處理它(表示層)是從驗證的地方(數據層)中刪除幾個函數調用,那麼你必須在每個級別檢查false。一個異常會傳播到捕獲它的第一個函數,繞過每個函數中剩餘的代碼。

function displayProductAction(...) { 
    $prodID = $request->getParam('prod'); 
    $form = ... 
    try { 
     $form->fill_data($prodID) 
     $view->form = $form; 
    } 
    catch (InvalidIdentifierException $e) { 
     $view->error = $e->getMessage(); 
    } 
    $view->render(); 
} 

調用die()會導致其自身的困難。單元測試更加困難,它迫使您將錯誤顯示代碼置於故障點。當你想從一個web服務使用你的代碼時會發生什麼?

0

應該驗證您輸入的時候不使用die()
你的用戶應該看到一個正確的錯誤信息和關於如何給出正確輸入的提示。

因此,我建議你使用第一種方式。
根據您的體系結構,拋出異常而不是返回false可能更有意義。

+0

是的,死是有點苛刻,但肯定用戶會將消息(這將是唯一的東西在頁面上) – 2011-02-08 02:06:24