Как проверить поле формы в PHP с помощью объектно-ориентированной техники

Я создал класс «validate» для проверки двух полей, т.е. «firstname» и «lastname». Он не работает нормально, он показывает ошибку, когда поле пуст, но когда я отправляю форму с непустыми полями, ошибка все еще существует. Как это выполнить при отправке формы?

<?php class validation { public $firstName, $lastName, $errorFirstName = '', $errorLastName = ''; function __constructor($fName, $lName){ $this->firstName = $fName; $this->lastName = $lName; } function check(){ if($_SERVER["REQUEST_METHOD"] == "POST"){ if(empty($this->firstName)){ $this->errorFirstName = 'First name is required'; } else { $this->errorFirstName = 'Input is okay'; } if(empty($this->lastName)){ $this->errorLastName = 'Last name is required'; } else { $this->errorLastName = 'Input is okay'; } } } } $obj = new validation($_POST['firstname'], $_POST['lastname']); $obj->check(); $errorF = $obj->errorFirstName; $errorL = $obj->errorLastName; ?> <!DOCTYPE html> <html lang = "en-US" dir = "ltr"> <head> <title>Home</title> <meta charset = "UTF-8"/> </head> <body> <form method = "POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <label>First Name: </label> <input type = "text" name = "firstname" placeholder = "John"/> <p class = "error"><?php echo $errorF;?></p> <label>Last Name: </label> <input type = "text" name = "lastname" placeholder = "Doe"/> <p class = "error"><?php echo $errorL;?></p> <input type="submit"> </form> </body> </html> 

Solutions Collecting From Web of "Как проверить поле формы в PHP с помощью объектно-ориентированной техники"

Каждый всегда делает «класс базы данных» и «класс проверки». Эх … whaaaaay?

Не используйте класс проверки. Он никогда не работает. Наиболее … emm … устойчивыми параметрами для проверки ввода пользователя являются:

  • выполнить проверку в доменах
  • использовать объекты ценности

С использованием сущностей для проверки это довольно просто. В вашем случае у вас будет класс Profile которого есть метод setFirstName(string $name) . Затем в рамках этого метода вы выполняете проверку и по ошибке генерируете сделанное пользователем исключение , такое как InvalidFirstName .. или что-то в этом роде.

Использование объектов значений немного сложнее, но это предотвращает дублирование кода. Например, вам необходимо проверить адрес электронной почты. Таким образом, способ, которым вы хотели бы использовать его, выглядел бы примерно так:

 try { $profile = new Profile; $profile->setEmail(new EmailAddress($_POST['email'])); } catch (InvalidArgumentException $e){ // validation failed } 

Поэтому, чтобы получить это поведение, у вас будет класс, определенный следующим образом:

 class EmailAddress { private $email; public function __construct(int $emailId = null, string $email = null) { if (!$this->isValid($email)) { throw new InvalidArgumentException('Not valid email address'); } $this->email = $email; } private function isValid($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } public function __toString() { return $this->email; } } 

Этот подход намного более выразителен, но он, как правило, становится большим gnarly, когда взаимодействует с уровнем persistence.

На практике лучшим вариантом является использование комбинации этих двух решений:

  • сохранять достоверность в сущности, для правил, которые являются уникальными
  • использовать объекты значений для часто повторяющихся ограничений