Проверять сущность домена после установки каждого свойства или сразу сразу? - PullRequest
2 голосов
/ 17 марта 2012

При проверке сущности домена, лучше ли проверять значения, как они установлены, или все сразу с помощью валидатора (такого как в Symfony2) позже?

Например:

Вариант 1. Подтвердить, пока настроено

public function setEmail($email)
{
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new EntityException('The specified email address ' . $email . ' is invalid.');
    }

    $this->_email = $email;
    return $this;
}

Вариант 2. Подтвердить позже ...

$user = new UserEntity();
$user->setEmail('johnnie@duh.com');
$validator = new Validator();
$validator->validate($user);

Вариант 3. Оба из вышеперечисленных (хотя кажется немного избыточным и не стоит накладных расходов).

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

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

Что сводится к ...
В общем, звучит так, как будто я хочу ХОРОШИЙ вариант 2, но чувствую, что жертвовать воздухонепроницаемостью сущности (например, если я забуду запустить сущность через валидатор), может быть глупо.

Ответы [ 2 ]

2 голосов
/ 17 марта 2012

Несомненно, возникнут ситуации, когда проверка не требуется на уровне приложения (т. Е. Вы знаете, что работаете с действительными данными в определенный момент).Хотя в этих случаях нет ничего плохого в применении проверки, это, безусловно, излишне.

Кроме того, вы можете оказаться в сценарии, в котором вы хотите выполнить «массовую проверку» поступающих данных.Это, скорее всего, больше применимо к сервису или к реализованным на заказ формам, в которых у вас нет, например, платформы проверки форм Symfony, к которой можно прибегнуть.

Это будет означать, что вариант 2 является более желательнымМожно предположить, что валидатор должен вызываться автоматически при попытке сохранения объекта (например, во время события предварительного сохранения модели; я еще не знаком с Doctrine 2, но Doctrine 1.2 действительно имеет свой собственныйструктура проверки, которая может выполнить это ).

Наличие недействительных данных, безусловно, никогда не является желательным сценарием, но при условии, что вы можете быть уверены, что недействительные данные не сохраняются, это дает вам свободу доверятьвсе данные, которые вы извлекаете из базы данных, действительны (обратите внимание, что я говорю «действительный», а не «заслуживающий доверия»!).

1 голос
/ 17 марта 2012

Принцип единой ответственности

Лучше всего иметь все необходимые проверки в отдельном слое.При этом будет проще поддерживать и тестировать валидаторы.Также проще проверять данные в вашем приложении.

Не повторяйте себя

Вам не нужно вызывать validate () для каждого объекта.

Все, что вам нужно сделать, - это выполнить проверку на уровне хранилища или на уровне службы, если он у вас есть.

$user = new User();
// [...]
$user->setEmail('myinvalidemail#blah,com');
$repository->save($user);

Итак, в вашем хранилище пользователя

UserRepository extends AbstractRepository {}

И общая проверка для всех сущностей:

abstract class AbstractRepository {
    public function save($entity) {
        $validator = // Get your validator based on the entity's name or something else
        $validator->validate($entity); // Throws exceptions or flag the  fields for future use

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