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?