Medeiros Corporation Inc.

Artigo

Tutorial de Implementação da Clean Architecture (Arquitetura Core)

Tutorial de Implementação da Clean Architecture (Arquitetura Core)

Fabrício de Medeiros

Introdução à Clean Architecture

A Clean Architecture organiza o código de maneira que o núcleo da aplicação seja independente de frameworks, bancos de dados, interfaces de usuário, e outros detalhes externos. Este tutorial irá guiá-lo através da implementação de uma aplicação simples de gerenciamento de usuários seguindo os princípios da Clean Architecture.


Estrutura do Projeto

Estruture seu projeto em camadas, conforme a Clean Architecture:

user-manager/

├── src/

│   ├── Domain/

│   │   ├── Entities/

│   │   │   └── User.php

│   │   ├── UseCases/

│   │   │   ├── CreateUser.php

│   │   │   └── ListUsers.php

│   ├── Application/

│   │   ├── Interfaces/

│   │   │   └── UserRepositoryInterface.php

│   │   └── Services/

│   │       └── UserService.php

│   ├── Infrastructure/

│   │   ├── Persistence/

│   │   │   └── MySQLUserRepository.php

│   │   └── Frameworks/

│   │       └── Web/

│   │           └── index.php

│   └── Interfaces/

│       └── Web/

│           ├── Controllers/

│           │   └── UserController.php

│           └── Views/

│               └── UserView.php

├── config/

│   └── database.php

├── vendor/

└── composer.json


Passo 1: Criando as Entidades (Domain/Entities)

No arquivo Domain/Entities/User.php, crie a entidade que representa o usuário:

<?php

namespace Domain\Entities;


class User {

    private $id;

    private $name;

    private $email;


    public function __construct($name, $email) {

        $this->name = $name;

        $this->email = $email;

    }


    public function getId() {

        return $this->id;

    }


    public function getName() {

        return $this->name;

    }


    public function getEmail() {

        return $this->email;

    }


    public function setId($id) {

        $this->id = $id;

    }


    public function setName($name) {

        $this->name = $name;

    }


    public function setEmail($email) {

        $this->email = $email;

    }

}

Passo 2: Criando os Casos de Uso (Domain/UseCases)

No arquivo Domain/UseCases/CreateUser.php, crie a lógica para a criação de usuários:

<?php

namespace Domain\UseCases;


use Domain\Entities\User;

use Application\Interfaces\UserRepositoryInterface;


class CreateUser {

    private $userRepository;


    public function __construct(UserRepositoryInterface $userRepository) {

        $this->userRepository = $userRepository;

    }


    public function execute($name, $email) {

        $user = new User($name, $email);

        return $this->userRepository->create($user);

    }

}

No arquivo Domain/UseCases/ListUsers.php, crie a lógica para listar os usuários:

<?php

namespace Domain\UseCases;


use Application\Interfaces\UserRepositoryInterface;


class ListUsers {

    private $userRepository;


    public function __construct(UserRepositoryInterface $userRepository) {

        $this->userRepository = $userRepository;

    }


    public function execute() {

        return $this->userRepository->listAll();

    }

}


Passo 3: Definindo a Interface do Repositório (Application/Interfaces)

No arquivo Application/Interfaces/UserRepositoryInterface.php, defina a interface do repositório de usuários:

<?php

namespace Application\Interfaces;


use Domain\Entities\User;


interface UserRepositoryInterface {

    public function create(User $user);

    public function listAll();

}

Passo 4: Implementando o Repositório (Infrastructure/Persistence)

No arquivo Infrastructure/Persistence/MySQLUserRepository.php, implemente o repositório usando MySQL:

<?php

namespace Infrastructure\Persistence;


use Application\Interfaces\UserRepositoryInterface;

use Domain\Entities\User;


class MySQLUserRepository implements UserRepositoryInterface {

    private $conn;


    public function __construct($db) {

        $this->conn = $db;

    }


    public function create(User $user) {

        $query = "INSERT INTO users SET name=:name, email=:email";


        $stmt = $this->conn->prepare($query);


        $stmt->bindParam(":name", $user->getName());

        $stmt->bindParam(":email", $user->getEmail());


        if ($stmt->execute()) {

            $user->setId($this->conn->lastInsertId());

            return true;

        }


        return false;

    }


    public function listAll() {

        $query = "SELECT * FROM users ORDER BY name";


        $stmt = $this->conn->prepare($query);

        $stmt->execute();


        $users = [];


        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {

            $user = new User($row['name'], $row['email']);

            $user->setId($row['id']);

            $users[] = $user;

        }


        return $users;

    }

}

Passo 5: Criando o Serviço de Aplicação (Application/Services)

No arquivo Application/Services/UserService.php, crie o serviço de aplicação para gerenciar os usuários:

<?php

namespace Application\Services;


use Domain\UseCases\CreateUser;

use Domain\UseCases\ListUsers;


class UserService {

    private $createUser;

    private $listUsers;


    public function __construct(CreateUser $createUser, ListUsers $listUsers) {

        $this->createUser = $createUser;

        $this->listUsers = $listUsers;

    }


    public function addUser($name, $email) {

        return $this->createUser->execute($name, $email);

    }


    public function getUsers() {

        return $this->listUsers->execute();

    }

}

Passo 6: Criando o Controlador (Interfaces/Web/Controllers)

No arquivo Interfaces/Web/Controllers/UserController.php, crie o controlador para manipular as requisições da interface:

<?php

namespace Interfaces\Web\Controllers;


use Application\Services\UserService;


class UserController {

    private $service;


    public function __construct(UserService $service) {

        $this->service = $service;

    }


    public function createUser($name, $email) {

        return $this->service->addUser($name, $email);

    }


    public function listUsers() {

        return $this->service->getUsers();

    }

}

Passo 7: Criando a Visão (Interfaces/Web/Views)

No arquivo Interfaces/Web/Views/UserView.php, crie a interface para listar e adicionar usuários:

<?php

namespace Interfaces\Web\Views;


use Interfaces\Web\Controllers\UserController;


class UserView {

    private $controller;


    public function __construct(UserController $controller) {

        $this->controller = $controller;

    }


    public function displayUsers() {

        $users = $this->controller->listUsers();


        echo "<h1>User List</h1>";

        echo "<ul>";


        foreach ($users as $user) {

            echo "<li>{$user->getName()} - {$user->getEmail()}</li>";

        }


        echo "</ul>";

    }


    public function addUserForm() {

        echo '<form method="post" action="index.php">

                <input type="text" name="name" placeholder="Name" required>

                <input type="email" name="email" placeholder="Email" required>

                <button type="submit" name="submit">Add User</button>

              </form>';

    }

}

Passo 8: Arquivo de Entrada (Infrastructure/Frameworks/Web/index.php)

No arquivo Infrastructure/Frameworks/Web/index.php, gerencie a lógica da interface e controle a entrada do usuário:

<?php

require_once '../../config/database.php';

require_once '../../vendor/autoload.php';


use Infrastructure\Persistence\MySQLUserRepository;

use Domain\UseCases\CreateUser;

use Domain\UseCases\ListUsers;

use Application\Services\UserService;

use Interfaces\Web\Controllers\UserController;

use Interfaces\Web\Views\UserView;


$database = new Database();

$db = $database->getConnection();


$userRepository = new MySQLUserRepository($db);

$createUser = new CreateUser($userRepository);

$listUsers = new ListUsers($userRepository);

$userService = new UserService($createUser, $listUsers);

$userController = new UserController($userService);

$userView = new UserView($userController);


if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['submit'])) {

    $name = $_POST['name'];

    $email = $_POST['email'];


    if ($userController->createUser($name, $email)) {

        echo "User created successfully!";

    } else {

        echo "Unable to create user.";

    }

}


$userView->addUserForm();

$userView->displayUsers();

Executando o Projeto


Explore, Contribua e Cresça Conosco!

Obrigado por ler o nosso artigo! Esperamos que você tenha encontrado informações valiosas e inspiradoras. Se você está empolgado para saber mais, temos uma vasta coleção de artigos sobre tópicos variados, desde tendências tecnológicas até insights sobre desenvolvimento de software. Não deixe de explorar nossas outras publicações!

Quer fazer parte da nossa comunidade?

Inscreva-se no nosso site para receber as últimas atualizações e novidades diretamente no seu e-mail. Seu cadastro é o primeiro passo para se conectar com uma rede de entusiastas e profissionais apaixonados pelo que fazem.

Tem algo a compartilhar?

Adoraríamos ouvir suas ideias, inovações e experiências! Sinta-se à vontade para escrever e enviar seus próprios artigos, códigos ou projetos. Sua contribuição é fundamental para enriquecer nosso conteúdo e ajudar outros leitores a crescer junto com você. Juntos, podemos criar um espaço de aprendizado e troca de conhecimento enriquecedor. Seu conhecimento e entusiasmo são o que fazem nossa comunidade especial.

Inscreva-se Agora | Compartilhe | Contribua com um Artigo
Continue explorando e seja parte da transformação!

Voltar