DDD y MVC: diferencia entre 'Modelo' y 'Entidad'
Estoy seriamente confundido sobre el concepto del 'Modelo' en MVC. La mayoría de los marcos que existen hoy colocan el Modelo entre el Controlador y la base de datos, y el Modelo casi actúa como una capa de abstracción de la base de datos. El concepto de 'Controlador flaco modelo gordo' se pierde cuando el Controlador comienza a hacer más y más lógica.
En DDD, también existe el concepto de una entidad de dominio, que tiene una identidad única. Según tengo entendido, un usuario es un buen ejemplo de una entidad (ID de usuario único, por ejemplo). La entidad tiene un ciclo de vida: sus valores pueden cambiar a lo largo de la acción, y luego se guarda o se descarta.
¿La entidad que describo arriba es lo que pensé que se suponía que Model debía estar en MVC? ¿Qué tan fuera de base estoy?
Para desordenar más las cosas, agrega otros patrones, como el patrón de Repositorio (tal vez poner un Servicio allí). Está bastante claro cómo el Repositorio interactuaría con una Entidad, ¿cómo lo hace con un Modelo?
Los controladores pueden tener múltiples modelos, lo que hace que parezca que un modelo es menos una "tabla de base de datos" que una entidad única.
ACTUALIZAR: En este post El modelo se describe como algo con conocimiento, y puede ser singular o una colección de objetos. Entonces suena más como una Entidad y un Modelo son más o menos lo mismo. El Modelo es un término que lo abarca todo, donde una Entidad es más específica. Un objeto de valor también sería un modelo. Al menos en términos de MVC. ¿¿¿Tal vez???
Entonces, en términos muy generales, ¿cuál es mejor?
Ningún "modelo" realmente ...
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
O esto, que tiene un modelo como el 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 ejemplos ni siquiera hicieron lo que estaba describiendo anteriormente. Claramente estoy perdido. Cualquier entrada?