Где должна проходить валидация?

Я хочу использовать шаблон MVC в своем проекте PHP. Я также хочу использовать шаблон Dao-Service для уровня модели, так как он делает механизмы базы данных легко взаимозаменяемыми и защищает бизнес-логику от взаимодействия с БД.

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

Должно ли оно, однако, быть реализовано на уровне сервиса или самих сущностях?

Подход 1: проверка в субъектах
class Post extends Entity
{
    protected $title;

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($newTitle)
    {
        if (strlen($newTitle) == 0)
            throw new ValidationException('Title cannot be empty.');
        $this->title = $newTitle;
    }
}

class PostService
{
    public static function saveOrUpdate(Post $post)
    {
        PostDao::saveOrUpdate($post);
    }
}

Плюсы:

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

Минусы:

много шаблонного кода из-за причудливых сеттеров и геттеров,добавляет некоторую бизнес-логику к сущности, что кажется плохой вещью (особенно если проверка очень сложна - например, необходимо запрашивать базу данных / другие службы),сериализация и десериализация могут стать трудными.Подход 2: проверка в обслуживании
class Post extends Entity
{
    public $title;
}

class PostService
{
    public static function saveOrUpdate(Post $post)
    {
        if (strlen($post->title) == 0)
            throw new ValidationException('Title cannot be empty.');
        PostDao::saveOrUpdate($post);
    }
}

Плюсы:

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

Минусы:

Я не знаю сразу, когда что-то пойдет не так икакие действительно пошло не так.У меня нет гарантии, что проверка действительно будет иметь место перед сохранением в базе данных. Пример: я должен сохранить пост в двух подпрограммах, забыть использоватьPostService::saveOrUpdate прокси в одном из них и сделать это напрямую черезPostDao::saveOrUpdate, Вообще-то, валидация не происходит в этой рутине, и единственной надеждой проекта теперь являются юнит-тесты или я обнаружил это в коде. Таким образом, код в этом отношении сложнее поддерживать.

У вас есть какие-нибудь намеки, ТАК? Я что-то пропустил? Пока что проект на чертежной доске, поэтому я готов ко всему.

Ответы на вопрос(2)

Ваш ответ на вопрос