DDD e MVC: Diferença entre 'Modelo' e 'Entidade'

Estou seriamente confuso sobre o conceito de 'Model' no MVC. A maioria das estruturas existentes hoje coloca o Modelo entre o Controller e o banco de dados, e o Modelo quase age como uma camada de abstração do banco de dados. O conceito de 'Controlador Magro Modelo Gordo' é perdido à medida que o Controlador começa a fazer mais e mais lógica.

No DDD, também existe o conceito de uma entidade de domínio, que possui uma identidade única. Pelo que entendi, um usuário é um bom exemplo de uma Entidade (ID do usuário exclusivo, por exemplo). A Entidade tem um ciclo de vida - seus valores podem mudar ao longo da ação - e então é salva ou descartada.

A Entidade que descrevi acima é o que eu pensava que o Model deveria estar no MVC? Como estou fora da base?

Para desorganizar ainda mais as coisas, você lança outros padrões, como o padrão do Repositório (talvez colocando um Serviço nele). Está bem claro como o Repositório interagia com uma Entidade - como isso faz com um Modelo?

Os controladores podem ter vários modelos, o que faz parecer que um modelo é menos uma "tabela de banco de dados" do que uma entidade única.

ATUALIZAR: Neste post o modelo é descrito como algo com conhecimento e pode ser singular ou uma coleção de objetos. Portanto, parece mais uma entidade e um modelo mais ou menos o mesmo. O Modelo é um termo abrangente, em que uma Entidade é mais específica. Um Objeto de Valor também seria um Modelo. Pelo menos em termos de MVC. Talvez???

Então, em termos muito grosseiros, qual é o melhor?

Nenhum "modelo" realmente ...

class MyController {
    public function index() {
        $repo = new PostRepository();
        $posts = $repo->findAllByDateRange('within 30 days');
        foreach($posts as $post) {
            echo $post->Author;
        }
    }
}

Ou isso, que tem um modelo como o DAO?

class MyController {
    public function index() {
        $model = new PostModel();
        // maybe this returns a PostRepository?
        $posts = $model->findAllByDateRange('within 30 days');
        while($posts->getNext()) {
            echo $posts->Post->Author;
        }
    }
}

Ambos os exemplos nem fizeram o que descrevi acima. Estou claramente perdido. Alguma entrada?

questionAnswers(5)

yourAnswerToTheQuestion