DownloadImplementação do Padrão Facade em um Sistema de Login com Verificação de Código
-
Estrutura do Sistema
## Subsistemas Complexos:
-
AuthService: Autentica as credenciais do usuário.
-
EmailService: Envia códigos de verificação por e-mail.
-
CodeService: Gera e valida códigos de verificação.
-
TokenService: Gera tokens JWT.
-
LogService: Registra logs de acesso.
Facade:
-
LoginFacade: Encapsula a interação com os subsistemas para realizar o processo de login completo.
Processo de Login sem Facade
Sem o Padrão Facade, o controlador de login precisaria interagir diretamente com cada subsistema:
Autenticar o Usuário:
-
Verificar as credenciais no AuthService.
### Gerar e Enviar Código:
-
Gerar o código no CodeService.
-
Enviar o código via EmailService.
### Validar o Código:
-
Validar o código no CodeService.
### Gerar Token:
-
Gerar o token JWT no TokenService.
### Registrar Log:
-
Registrar cada ação no LogService.
Isso resultaria em um controlador com múltiplas responsabilidades, aumentando a complexidade e o acoplamento.
Processo de Login com Facade
Com o Padrão Facade, toda essa lógica é encapsulada na LoginFacade, proporcionando uma interface única e simplificada para o controlador de login:
Chamar loginFacade->login($username, $password, $email):
-
Internamente, autentica o usuário.
-
Gera e envia o código de verificação.
-
Registra os logs correspondentes.
### Chamar loginFacade->confirmCode($username, $code):
-
Valida o código de verificação.
-
Gera o token JWT.
-
Registra os logs correspondentes.
### Chamar loginFacade->logout($username) (opcional):
-
Registra o logout.
Vantagens:
-
Simplificação: O controlador lida apenas com a fachada, sem precisar conhecer os detalhes dos subsistemas.
-
Desacoplamento: Mudanças nos subsistemas não afetam o controlador, desde que a interface da fachada permaneça a mesma.
-
Centralização: Toda a lógica de login está centralizada na fachada, facilitando manutenção e extensão.
UML
+----------------+ +----------------+ +-----------------------+
| LoginFacade |<>------->| AuthService | | EmailService |
+----------------+ +----------------+ +-----------------------+
| +login() | | +authenticate()| | +sendVerificationCode()|
| +confirmCode() | +----------------+ +-----------------------+
| +logout() | |
+----------------+ +----------------+ +----------------+
| | CodeService | | TokenService |
| +----------------+ +----------------+
| |
| |
| |
| +----------------+
| | LogService |
| +----------------+
|
|
v
+----------------+
| Controller |
+----------------+
| +login() |
| +confirmCode() |
+----------------+
Considerações Finais
O conteudo do repositório é experimental como um modelo apenas para exemplificar em uma aula sobre padrões de projeto e é apenas um modelo que precisa ser expandido.
O uso do Padrão Facade neste contexto de login:
Simplifica o controlador, que agora lida apenas com a fachada e não com múltiplos subsistemas.
Desacopla os componentes, permitindo alterações internas sem impactar o controlador.
Centraliza a lógica de login, facilitando manutenção e extensão.
Recursos Adicionais
-
Documentação do Firebase JWT: Firebase PHP-JWT
-
Livros:
Design Patterns: Elements of Reusable Object-Oriented Software por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides (Gang of Four).
-
Sites:
Refactoring Guru
SourceMaking
|