¿Dónde debe llevarse a cabo la validación?

Quiero usar el patrón MVC en mi proyecto PHP. También quiero usar el patrón Dao-Service para la capa Modelo, ya que hace que los motores de bases de datos sean fácilmente intercambiables y mantiene la lógica empresarial fuera de la interacción de la base de datos.

Ahora,he oído esa validación debería ocurrir en la capa Modelo, ya que los Controladores solo son responsables del transporte de datos. Eso es bastante razonable.

Sin embargo, ¿debería implementarse en la capa de Servicio o en las propias entidades?

Enfoque 1: validación en entidades
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);
    }
}

Pros:

Sé de inmediato si hago algo mal,todo está en un solo lugar, lo que parece algo bueno.

Contras:

un montón de código repetitivo debido a los setters y getters elegantes,agrega algo de lógica empresarial a la entidad, lo que parece algo malo (especialmente si la validación es muy compleja, por ejemplo, necesita consultar la base de datos / otros servicios),serializar y deserializar puede volverse difícil.Enfoque 2: validación en servicio
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);
    }
}

Pros:

mantiene la lógica de negocios al servicio, lo que parece algo bueno,la caldera se mantiene al mínimo.

Contras:

No sé de inmediato cuándo las cosas van mal yqué En realidad salió mal.No tengo ninguna garantía de que la validación tenga lugar antes de guardarla en la base de datos. Un ejemplo: tengo que guardar la publicación en dos rutinas, olvídate de usarPostService::saveOrUpdate proxy en uno de ellos y hacerlo directamente a través dePostDao::saveOrUpdate. Puff, la validación no tiene lugar en esa rutina y la única esperanza del proyecto ahora son las pruebas unitarias o que yo mismo lo vea en el código. Por lo tanto, el código es más difícil de mantener a este respecto.

¿Tienes alguna pista, SO? ¿Me estoy perdiendo de algo? Hasta ahora, el proyecto está en el tablero de dibujo, así que estoy listo para cualquier cosa.

Respuestas a la pregunta(2)

Su respuesta a la pregunta