php model-view-controller model domain-driven-design entity

php - DDD y MVC: diferencia entre ''Modelo'' y ''Entidad''



model-view-controller domain-driven-design (5)

Entidad

Entity significa un objeto que es un elemento único con el que funciona la lógica comercial, más específicamente aquellos que tienen una identidad de algún tipo.
Por lo tanto, muchas personas se refieren a objetos mapeados ORM como entidades.

Algunos se refieren como " entidad " a una clase, una instancia de la cual representa una sola fila en una base de datos.

Algunas otras personas prefieren llamar solo a aquellas de estas clases como "entidad", que también contienen reglas comerciales, validación y comportamiento general, y llaman a las otras como " objetos de transferencia de datos ".

Modelo

Un Model es algo que no está directamente relacionado con la interfaz de usuario (= View ) y el flujo de control (= Controller ) de una aplicación, sino más bien con la forma en que funciona el acceso a datos y la abstracción principal de datos de la aplicación.

Básicamente, cualquier cosa puede ser un modelo que se adapte a lo anterior.

MVC

Puede usar entidades como sus modelos en MVC. Significan dos cosas diferentes, pero las mismas clases se pueden llamar ambas.

Ejemplos

  • Una clase de Customer es en gran medida una entidad (generalmente), y también la utiliza como parte del acceso a datos en su aplicación. Es a la vez una entidad y un modelo en este caso.
  • Una clase de Repository puede ser parte del modelo, pero claramente no es una entidad.
  • Si hay una clase que utiliza en el medio de su capa de lógica de negocios pero no la expone al resto de la aplicación, puede ser una entidad, pero claramente no es un Modelo desde la perspectiva de la aplicación MVC.

Tu ejemplo

En cuanto a los ejemplos de código, preferiría el primero.
Un modelo es una clase que se utiliza como un medio de abstacción de datos de una aplicación, no una clase que tiene un nombre con el sufijo "Modelo". Mucha gente considera el último bloatware.

Puede considerar su clase de repositorio como parte de su modelo, incluso si su nombre no tiene el sufijo "Modelo".

Añadiría a eso el hecho de que también es más fácil trabajar con el primero, y para otras personas que más adelante puedan tener que entender su código, es más fácil de entender.

Estoy muy confundido sobre el concepto de ''Modelo'' en MVC. La mayoría de los marcos que existen hoy ponen 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 ''Fat Model Skinny Controller'' 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 (userid ú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 descarta.

La Entidad que describo arriba es lo que pensé que se suponía que era Model en MVC? ¿Qué tan fuera de base estoy?

Para complicar más las cosas, agregas otros patrones, como el patrón Repositorio (tal vez poner un Servicio allí). Está bastante claro cómo interactuaría el repositorio con una entidad. ¿Cómo funciona con un modelo?

Los controladores pueden tener varios modelos, lo que hace que parezca que un modelo es menos una "tabla de base de datos" que una entidad única.

ACTUALIZACIÓN: en esta publicación, 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 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 toscos, ¿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 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 arriba. Estoy claramente perdido. ¿Alguna entrada?


El "modelo" en su aplicación es el bit que contiene sus datos. La "entidad" en el diseño impulsado por dominio es, si no recuerdo mal, un modelo con una identidad. Es decir, una entidad es un modelo que generalmente corresponde directamente a un elemento "físico" en una base de datos o archivo. Creo que DDD define dos tipos de modelos, uno es la entidad, el otro es el valor, que es solo un modelo sin identidad.

El patrón Repositorio es solo un tipo de colección indexada de modelos / entidades. Entonces, por ejemplo, si su código quiere el pedido n. ° 13, primero lo solicitará al depósito y, si no puede obtenerlo desde allí, lo buscará desde donde sea. Básicamente es un caché de nivel 1 si se quiere. No hay diferencia en cómo actúa con un modelo y cómo actúa con una entidad, pero dado que la idea de un repositorio es poder obtener modelos usando sus ID, en términos de DDD, solo se permitirían entidades en el repositorio.



Todas las respuestas son una mezcla masiva de cosas diferentes y simplemente incorrectas.

Un modelo en DDD es muy parecido a un modelo en el mundo real: una simplificación y abstracción de algo. No menos y no más. No tiene nada que ver con datos ni objetos ni nada más. Es simplemente el concepto de una parte de dominio. Y también en todos los dominios complejos siempre hay más de un modelo, por ejemplo, Trading, Facturación, Logística.

Una entidad no es un "modelo con identidad" sino simplemente un objeto con identidad.

Un repositorio no es solo un caché de primer nivel, sino también una parte del dominio. Está dando una ilusión de objetos en memoria y es responsable de buscar Agregados (¡no entidades!) Desde cualquier lugar y guardarlos, es decir, mantener el ciclo de vida de los objetos.

Si habla sobre conceptos de DDD, primero corrija sus conocimientos leyendo los conceptos básicos. Como aquí ThinkDDD .


Una solución simple usando servicio y colección:

<?php class MyController { public function index() { $postService = ServiceContainer::get(''Post''); $postCollection = $postService->findAllByDateRange(''within 30 days''); while($postCollection->getNext()) { echo $postCollection->current()->getAuthor(); } } }

EDITAR: El modelo (clase) es la representación simple del esquema de la entidad. El modelo (objeto) es una entidad única. El servicio opera en modelos y proporciona datos concretos a los controladores. Ningún controlador tiene ningún modelo. Los modelos son independientes.
Por otro lado, los cartógrafos asignan los modelos a capas de persistencia (p. Ej .: bases de datos, backends de terceros, etc.).