PHP с использованием массива в классе проверки - PullRequest
0 голосов
/ 01 января 2011

На моем сайте есть страница регистрации, где пользователь вводит свою информацию, чтобы зарегистрироваться на моем сайте.

Когда он это делает, я обрабатываю введенную пользователем информацию.Теперь при обработке я использую массивы для облегчения процесса, а не для того, чтобы я писал один и тот же код снова и снова.Например, вот как я собираю информацию о пользователе и проверяю ее, используя метод в своем классе проверки.

$data = array(
   $_POST['firstname'] => "First Name",
   $_POST['lastname'] => "Last Name"
);

foreach($data as $userInput => $fieldName) {
   $validation = new Validation();
   $result = $validation->checkEmpty($userInput, $fieldName);
}

Теперь это все работает для меня на моей странице, я могу проверить, еслипользователь оставил что-то пустое в регистре с помощью метода "checkEmpty", который также возвращает массив полей, оставленных пустыми.Я не показывал метод, потому что это не часть моей проблемы.Теперь, вот мой вопрос, я также хочу проверить длину полей.Что было бы для меня хорошим способом сделать это без переписывания вещей снова и снова?Должен ли я сделать другой массив?

Я думаю, что-то вроде этого, может быть?

$data2 = array(
  $_POST['firstname'] => 30,
  $_POST['lastname'] => 35
),

foreach($data as $userInput => $limit) {
   $result = $validation->checkLength($userInput, $limit);
}

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

Ответы [ 4 ]

1 голос
/ 01 января 2011

Я бы структурировал массив совершенно иначе, примерно так:

$config = array(
   'firstname' => array('notEmpty' = true,
                        'limit' => 30),
   'lastname' => array('notEmpty' = true,
                       'limit' => 35)
);

Тогда я бы создал метод validate, который выглядит следующим образом:

public function validate($config, $data) {
    $error = array();
    foreach($data as $field => $value) {
        $c = $config[$field];
        if(array_key_exists('notEmpty', $c)) {
            if(!$this->checkEmpty($value)) {
                $this->addError($error, $field, 'Must not be empty');
            }
        }
        if(array_key_exists('limit', $c)) {
            if(!$this->checkLength($value, $c['limit'])) {
                $this->addError($error, $field, 'Must not be longer than' . $c['limit'] . ' characters');
            }
        }
        /*...*/
    }
    return $error;
}

private function addError(&$error, $field, $msg) {
    if(!array_key_exists($field, $error)) {
        $error[$field] = array();
    }
    $error[$field][] = $msg;
}

Тогда вы просто позвоните:

$validation = new Validation();
$errors = $validation->validate($config, $_POST);

и $errors будут содержать все сообщения об ошибках в каждом поле. Вам просто нужно зациклить их и напечатать их рядом с полем.

Конечно, этот код можно (и нужно!) Улучшить. Например. динамический поиск методов проверки).


Тем не менее, я настоятельно рекомендую посмотреть и использовать готовые классы проверки, такие как Zend_Validate

0 голосов
/ 01 января 2011

Вы также можете получить вдохновение, взглянув на некоторые механизмы валидации фреймворков. CakePHP, например, очень прост в использовании: CakePHP несколько правил на поле

0 голосов
/ 01 января 2011

Вы закрываете класс валидации, но я думаю, что это важно.Для одного это должно использоваться статически, если у этого нет никакого состояния.Нет никакой причины для того, чтобы конструировать его каждую итерацию цикла таким образом!

 Validation::checkEmpty($x);

AS для проверки длины, id предлагает вам сохранить поля в Validation что-то вроде

 protected $lengths = array( 'firstname' => 35, 'lastname' => 30, 'default' => 100);

и вызывать егос

 Validation::checkLength($userInput, $fieldName);

с таким телом, как

 protected static function checkLength($subject, $fieldType = 'default')
 {
        return strlen($subject) < self::$lengthTypes($fieldType);
        //or self::$fields['lengthLimit'] if you are going to structure it like Felix suggest
 }

Вам не нужно, чтобы я говорил, что функция lengthChecker($subject, $limit) довольно бессмысленна.

РЕДАКТИРОВАТЬ -реструктуризация, как предложил Феликс, неплохая идея, в зависимости от того, как далеко вы хотите это сделать.Его выглядит более расширяемым.Если вы собираетесь реализовать addError, вам, вероятно, не нужен статический дизайн.

0 голосов
/ 01 января 2011

Я думаю, что использование имен полей в качестве ключей для вашего массива может быть лучшим подходом. Тогда да, используйте многомерный массив как-то так.

$data = array(
   'First Name' => array($_POST['firstname'], 30),
   'Last Name' => array($_POST['lastname'], 35)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...