Estoy interesado en DDD (Diseño dirigido por el dominio) en los últimos días, pero no puedo entender las responsabilidades de quién crea y valida las entidades. Voy a romper estas preguntas para cubrir diferentes escenarios.DDD - Responsabilidad de creación y validación de entidades
Entidad regular (Posiblemente con objeto de valor). Como ejemplo, tomemos un usuario identificado por correo electrónico. Tengo un UserFactory que recibe una matriz de datos (posiblemente desde el formulario POST) y me devuelve una nueva UserEntity. ¿Debería la fábrica validar la integridad de los datos (por ejemplo, una cadena dada como Correo electrónico es un correo electrónico real, contraseñas en el campo de contraseña 1 y coincidencia de campo 2, etc.)? ¿Debería la fábrica validar que ya no existe ese usuario (no queremos registrar dos usuarios con el mismo correo electrónico)? En caso afirmativo, ¿debería hacerlo él mismo o usar el UserRepository?
Entidad agregada. Supongamos que tenemos una entidad Post y entidades de Comentarios. Quiero obtener la publicación 12 con todos sus comentarios, así que hago algo como
$ post = $ postRepository-> getById (12);
¿Cómo se debe implementar getById? de esta manera:
public function getById($id) {
$postData = $this->magicFetchFromDB($id);
$comments = (new CommentRepository())->getForPost(12);
return new PostEntity($postData, $comments);
}
O tal vez el cargo responsable de la creación perezosa sus comentarios, algo así como:
class PostEntity {
public function getComments() {
if(is_null($this->_comments)) $this->_comments = (new CommentRepository())->getForPost($this->_id);
return $this->_comments;
}
}
? Estoy muy perdido aquí y no hay suficiente información con ejemplos de DDD en PHP, ¡así que cualquier ayuda será apreciada!
Muchas gracias, skwee.
¡Gracias por tu comentario! A) No estoy seguro acerca de poner validación en la entidad. ¿Consideraría validar el captcha como parte de la lógica comercial? ¿Y qué pasa si tengo el panel de administración para agregar usuarios manualmente sin la necesidad de captcha? B) Sí, puedo, pero la pregunta es ¿de quién es la responsabilidad? Capa de validación? ¿Fábrica? ¿Repositorio? C) Bien, pero ¿y si tengo un Usuario que tiene publicaciones que tienen comentarios, será inteligente cargar todos estos datos para mostrar la página del perfil del usuario? –
a) Depende de sus necesidades realmente, he encontrado que es "más fácil" tener validación en la propia entidad usando clases de ayuda. pero agregar una capa adicional de validación está perfectamente bien. b) diría que es la responsabilidad de la capa de validación. si dos cuentas no pueden tener el mismo número e intenta agregar una con un número que ya existe, eso significa que la entidad es ** inválida **, o al menos eso es lo que pienso. – jere
c) esto también depende de lo que desee. si va a mostrar toda esa información de una vez en la página de perfil, entonces sí, cargue toda la información en una sola llamada. pero si muestra, digamos, solo las publicaciones, y cuando hace clic en una muestra los comentarios, sería mejor cargar los comentarios en ese momento, tal vez usando ajax – jere