A Arquitetura Hexagonal, também conhecida como Ports and Adapters, é uma abordagem que visa desacoplar o núcleo da aplicação de suas dependências externas, como bancos de dados, APIs, interfaces de usuário e outros sistemas externos.
A ideia central da Arquitetura Hexagonal é garantir que o núcleo da aplicação, a lógica de negócio, seja isolado de detalhes de implementação externa. A comunicação entre o núcleo e os sistemas externos ocorre por meio de portas (ports) e adaptadores (adapters).
- Núcleo da Aplicação (Core): Contém a lógica de negócio e as regras principais da aplicação. Ele é independente de qualquer tecnologia externa.
- Portas (Ports): São interfaces que definem como os adaptadores podem se comunicar com o núcleo da aplicação. As portas podem ser de entrada (input) ou de saída (output).
- Adaptadores (Adapters): São implementações específicas que conectam o núcleo da aplicação a sistemas externos. Por exemplo, um adaptador pode ser uma interface de banco de dados ou uma API externa.
/src
/core
- ApplicationService.php
- BusinessLogic.php
/infrastructure
/database
- DatabaseAdapter.php
/api
- ApiAdapter.php
/userInterface
- ConsoleApp.php
/ports
- InputPort.php
- OutputPort.php
Este repositório contém um exemplo de aplicação baseada na Arquitetura Hexagonal, com três módulos que se comunicam entre si:
- Core: O módulo que contém a lógica de negócios.
- Infrastructure: O módulo que se conecta a bancos de dados ou APIs.
- User Interface: O módulo que interage com o usuário (Console, Web, etc.).
- User Interface envia uma solicitação para o Core via a Porta de Entrada (Input Port).
- O Core processa a solicitação utilizando a Lógica de Negócios e, se necessário, chama a Infrastructure através da Porta de Saída (Output Port).
- A Infrastructure realiza operações externas (exemplo: consulta ao banco de dados ou chamada a uma API) e retorna o resultado ao Core.
- O Core envia a resposta final para a User Interface.
A estrutura do código está organizada da seguinte maneira:
- Core: Contém a lógica de negócios da aplicação.
- Ports: Define as interfaces de comunicação (entrada e saída).
- Adapters: Implementações que conectam o núcleo a sistemas externos.
- User Interface: Comunicação com o usuário, seja via console, API, etc.
A seguir, será mostrado um exemplo de como os módulos se comunicam na Arquitetura Hexagonal.
<?php
namespace Core;
use Ports\InputPort;
use Ports\OutputPort;
class ApplicationService implements InputPort {
private $businessLogic;
private $outputPort;
public function __construct(BusinessLogic $businessLogic, OutputPort $outputPort) {
$this->businessLogic = $businessLogic;
$this->outputPort = $outputPort;
}
public function execute($input) {
$result = $this->businessLogic->process($input);
$this->outputPort->send($result);
}
}
?><?php
namespace Core;
class BusinessLogic {
public function process($input) {
return strtoupper($input); // Exemplo simples de lógica de negócios
}
}
?><?php
namespace Infrastructure\Database;
use Ports\OutputPort;
class DatabaseAdapter implements OutputPort {
public function send($data) {
// Simula o envio de dados para o banco de dados
echo "Enviado para o banco de dados: " . $data;
}
}
?><?php
namespace UserInterface;
use Core\ApplicationService;
use Core\BusinessLogic;
use Infrastructure\Database\DatabaseAdapter;
class ConsoleApp {
public function run() {
$businessLogic = new BusinessLogic();
$databaseAdapter = new DatabaseAdapter();
$applicationService = new ApplicationService($businessLogic, $databaseAdapter);
$input = "Exemplo de Arquitetura Hexagonal";
$applicationService->execute($input);
}
}
$app = new ConsoleApp();
$app->run();
?><?php
namespace Ports;
interface InputPort {
public function execute($input);
}
?><?php
namespace Ports;
interface OutputPort {
public function send($data);
}
?>Contribuições para melhorar o conteúdo e os exemplos são bem-vindas! Feel free to open issues or submit pull requests.