1
resposta

Como acessar propriedade privada de uma entidade

Vamos imaginar um cenário onde eu tenho um controlador que chama no repositório de alunos um método chamado buscarAlunoPorCpf(): Aluno

Nesse caso, esse repositório irá retornar um Aluno da entidade. Até ai ok.

Meu problema é o seguinte: Nesse objeto Aluno eu não poderei acessar suas propriedades privadas, como por exemplo: $aluno->nome

Somente é possível eu ter acesso ao nome através de um Getter, como por exemplo: $aluno->getNome();

Minha dúvida é: Onde eu devo fazer esse mapeamento de dados? Em uma camada de DTO, um UseCase?

Por que em um controlador que eu pego uma entidade pequena, com poucos atributos, é mole fazer o mapeamento.

Mas em um cenário onde uma mesma entidade Aluno tem 50 atributos diferentes, eu preciso de um local para fazer isso.

Exemplo de código com muitos atributos para serem mapeados (veja como fica extenso):

Class ControllerAluno {

    public function buscarAlunoPorCpf($cpf){

        $alunoRepository = new AlunoRepository();
        $aluno = $alunoRepository->buscarAlunoPorCpf($cpf);

        //Para eu acessar o nome desse aluno, eu teria que fazer o seguinte:
        $arrayAluno = [
            "nome" => $aluno->getNome(),
            "sobrenome" => $aluno->getNome(),
            "cpf" => $aluno->getNome(),
            "mae" => $aluno->getNome(),
            "pai" => $aluno->getNome(),
            "avo" => $aluno->getNome(),
            "papagaio" => $aluno->getNome(),
            "cachorro" => $aluno->getNome(),
            "corPreferida" => $aluno->getNome(),
            "rg" => $aluno->getNome(),
            "esporteFavorito" => $aluno->getNome(),
            "status" => $aluno->getNome(),
            "matricula" => $aluno->getNome(),
            "pais" => $aluno->getNome(),
            "cidade" => $aluno->getNome(),
        ];

        return json_encode($arrayAluno);

    }

}
1 resposta

Oi, Lucas! Tudo bem?

Desculpa a demora por um retorno.

Em relação a um cenário com muitos atributos é uma boa prática utilizar uma camada DTO para o mapeamento de dados, pois ela permitirá o acesso às propriedades privadas de uma entidade, mantendo o encapsulamento e segurança do código, e transferirá os dados entre as diferentes camadas da aplicação, como o controlador e o repositório.

O DTO atua como uma representação simplificada da entidade original, contendo apenas os atributos relevantes para a transferência de dados entre as diferentes camadas da aplicação. Ele é responsável por receber os dados do objeto original (entidade) e transferi-los para outras camadas. Isso ajuda a evitar que as propriedades privadas sejam acessadas diretamente, preservando o encapsulamento e a integridade dos dados.

Além disso, o uso de DTOs também facilita a manutenção e a evolução do código, uma vez que podemos adicionar ou remover atributos no DTO sem afetar diretamente as outras camadas da aplicação. Isso permite uma maior flexibilidade e escalabilidade do sistema.

No exemplo enviado, poderiamos criar um DTO chamado AlunoDTO, que teria os mesmos atributos da entidade Aluno. Assim, mapearíamos os dados do objeto Aluno para o objeto AlunoDTO de forma mais concisa.

Dessa forma, evitaríamos a repetição de código e manteríamos a sua legibilidade.

Espero ter ajudado. Caso tenha alguma dúvida, sinta-se à vontade para comunicar, estou à disposição.

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓