Проверка правильности ввода свойств метода - PullRequest
0 голосов
/ 08 февраля 2011

Как мне обработать проверку ввода метода?
Какой из этих двух способов является более правильным? или есть лучший способ
Этот метод вызывается конструктором, и $ prodID может быть введен пользователем или получен из базы данных.

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 ]

1 голос
/ 08 февраля 2011

Вариант 3. Используйте исключения и поместите проверку идентификатора как можно ближе к данным.

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() вызывает свои трудности. Это сложнее для модульного тестирования, и это заставляет вас помещать код ошибки в точку отказа. Что происходит, когда вы хотите использовать свой код из веб-службы?

0 голосов
/ 08 февраля 2011

Вы не должны использовать die() при проверке ввода.
Ваш пользователь должен увидеть правильное сообщение об ошибке и подсказки о том, как сделать правильный ввод.

Поэтому я предлагаю вам использовать первый способ.
В зависимости от вашей архитектуры может иметь больше смысла выдавать исключение, а не возвращать false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...