Как валидировать большое количество свойств класса? Привет. Предположим есть некий веб-сервис который принимает на вход данные о пользователе: ФИО, пол, профессия, город и т.д., всего их около 20. Все обязательны. Мне необходимо работать с этим сервисом. Для этого у меня есть класс User, в котором есть куча свойств:Class User { private $lastName; private $firstName; private $city; .... } При создании объекта класса User необходимо установить значения этих свойств. Правильно ли я понимаю, что у меня будет 20 методов вида setLastName(), setFirstName(), setCity() и т.д.? Это нормальная практика? Или есть более "красивый" способ? Кроме того, где должна происходить валидация значений? В этих же методах? Еще меня смущает "некрасивый" код вида:$user = new User(); $user->setLastName('Ivanov'); $user->setFirstName('Dmitriy'); $user->setCity('Moscow'); .... т.е. порядка 20 строк с установкой значений.
Для работы с большим количеством свойств класса и их валидации, можно применить следующие подходы:
Использование конструктора класса для установки значений свойств:
class User { private $lastName; private $firstName; private $city; public function __construct($lastName, $firstName, $city) { $this->setLastName($lastName); $this->setFirstName($firstName); $this->setCity($city); } public function setLastName($lastName) { // Валидация значения lastName $this->lastName = $lastName; } public function setFirstName($firstName) { // Валидация значения firstName $this->firstName = $firstName; } public function setCity($city) { // Валидация значения city $this->city = $city; } }
$user = new User('Ivanov', 'Dmitriy', 'Moscow');
2. Использование массива для передачи значений свойств: ```php class User { private $data = []; public function __construct($data) { foreach ($data as $key => $value) { $method = 'set' . ucfirst($key); if (method_exists($this, $method)) { $this->$method($value); } } } public function setData(array $data) { $this->data = $data; } public function setLastName($lastName) { // Валидация значения lastName $this->data['lastName'] = $lastName; } public function setFirstName($firstName) { // Валидация значения firstName $this->data['firstName'] = $firstName; } public function setCity($city) { // Валидация значения city $this->data['city'] = $city; } } $userData = ['lastName' => 'Ivanov', 'firstName' => 'Dmitriy', 'city' => 'Moscow']; $user = new User($userData);
В обоих случаях валидация значений может происходить в соответствующих сеттерах (методах), где проверяется корректность передаваемого значения. Таким образом, можно избежать дублирования кода и обеспечить чистоту и легкость поддержки вашего класса.
Для работы с большим количеством свойств класса и их валидации, можно применить следующие подходы:
Использование конструктора класса для установки значений свойств:
class User {private $lastName;
private $firstName;
private $city;
public function __construct($lastName, $firstName, $city) {
$this->setLastName($lastName);
$this->setFirstName($firstName);
$this->setCity($city);
}
public function setLastName($lastName) {
// Валидация значения lastName
$this->lastName = $lastName;
}
public function setFirstName($firstName) {
// Валидация значения firstName
$this->firstName = $firstName;
}
public function setCity($city) {
// Валидация значения city
$this->city = $city;
}
}
$user = new User('Ivanov', 'Dmitriy', 'Moscow');
2. Использование массива для передачи значений свойств:```php
class User {
private $data = [];
public function __construct($data) {
foreach ($data as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
}
public function setData(array $data) {
$this->data = $data;
}
public function setLastName($lastName) {
// Валидация значения lastName
$this->data['lastName'] = $lastName;
}
public function setFirstName($firstName) {
// Валидация значения firstName
$this->data['firstName'] = $firstName;
}
public function setCity($city) {
// Валидация значения city
$this->data['city'] = $city;
}
}
$userData = ['lastName' => 'Ivanov', 'firstName' => 'Dmitriy', 'city' => 'Moscow'];
$user = new User($userData);
В обоих случаях валидация значений может происходить в соответствующих сеттерах (методах), где проверяется корректность передаваемого значения. Таким образом, можно избежать дублирования кода и обеспечить чистоту и легкость поддержки вашего класса.