方法属性输入验证

时间:2011-02-08 01:53:17

标签: php oop design-patterns

我应该如何处理方法的输入验证?
在这两个中,哪一种更正确?或者有更好的方式
构造函数调用此方法,$ 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']);
}

2 个答案:

答案 0 :(得分: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()会导致自己遇到困难。单元测试更难,它会强制您将错误显示代码置于故障点。当您想要使用来自网络服务的代码时会发生什么?

答案 1 :(得分:0)

验证输入时,不应使用die() 您的用户应该看到正确的错误消息并提示如何提供正确的输入。

因此我建议您使用第一种方式 根据您的体系结构,抛出异常而不是返回false可能更有意义。