Alguma incerteza com a implementação do modelo de 3 estruturas (objeto de domínio, mapeador de dados e serviço)

Como o título sugere, estou tendo alguns pequenos problemas ao implementar o modelo de 3 estruturas (objeto de domínio, mapeador de dados e serviço).

No passado, quando alguém se registrava no meu site, eu simplesmente fazia

$user->register($firstName, $lastName, $emailAddress, $username...);

e esse método seria executado em etapas como esta

1. Check if the form sent was valid.
2. Check if all the required fields were filled.
3. Check the if the lengths of strings were valid and the range of integers etc.
4. Check if the input is in the correct format (regex).
5. Check if the username is already taken and if the email address already exists
   in the database
6. etc. etc.

Tudo isso funciona bem, mas estou tentando evitar isso porque quero que meu código seja mais reutilizável e testável.

Agora, com este Modelo de 3 estruturas, o Objeto de Domínio e o Mapeador de Dados devem se comunicar através de um Serviço para mantê-los isolados um do outro, então aqui está minha ideia de um serviço de Usuário.

class UserService {

    public function register($firstName, $lastName, $email...) {

        $userDO= $this->domainObjectFactory->build('User');
        $mapper  = $this->dataMapperFactory->build('User');

        // Is this where I start doing my validation like in the steps above???
        // And if this is where I start doing my checks, when I get to the part
        // where I have to check if the username they want is already taken how
        // how do I do that check?

    }    

}

E, em seguida, para realmente executar o que eu faria do meu controlador como assim

$userService = $this->serviceFactory->get('user');
$result = $userService->register($_POST['firstName']....);

A lógica (se e do outro) deve ir noregister() método no meuUserService classe certo? Porque se eles vão no objeto de domínio quando eu chegar ao estágio de precisar do banco de dados para fazer algumas verificações como se o nome de usuário já existe, como eu iria acessar o banco de dados? Eu realmente não sei desde que o objeto de domínio não deveria saber nada sobre uma fonte de dados.

Tem de haver uma maneira de acessar o banco de dados para pequenas consultas, como verificar se um nome de usuário ou endereço de e-mail já existe e muitas outras pequenas consultas que precisam ser feitas.

Eu tenho muitas entidades / objetos de domínio que precisam fazer um monte de pequenas consultas e no passado meu modelo tinha acesso ao banco de dados de qualquer método e poderia fazer essas consultas, mas isso não parece ser permitido com este modelo de 3 estruturas e estou morrendo de vontade de descobrir qual é a maneira correta de fazer isso porque tem que haver um jeito.

Eu estava voando até que descobri que um Model é uma camada que é dividida em 3 estruturas.

Qualquer ajuda ou impulso na direção certa seria muito apreciada, especialmente bons exemplos da vida real. A internet parece estar faltando para o meu problema específico.

Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion