{"id":16318283,"url":"https://github.com/dersonsena/clean-arch-pokemon","last_synced_at":"2025-03-17T14:07:35.766Z","repository":{"id":40569444,"uuid":"324385362","full_name":"dersonsena/clean-arch-pokemon","owner":"dersonsena","description":"Clean Architecture de um modo divertido e prático integrando uma API com uma API de Pokémon.","archived":false,"fork":false,"pushed_at":"2023-11-29T22:02:23.000Z","size":2270,"stargazers_count":200,"open_issues_count":1,"forks_count":26,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-03-05T04:12:54.866Z","etag":null,"topics":["clean-architecture","clean-code","php","php7","pokemon"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dersonsena.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-25T15:19:26.000Z","updated_at":"2024-12-10T20:22:59.000Z","dependencies_parsed_at":"2024-10-27T10:54:28.228Z","dependency_job_id":"ef077d73-2dde-42c9-80b6-3df795a4d91b","html_url":"https://github.com/dersonsena/clean-arch-pokemon","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dersonsena%2Fclean-arch-pokemon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dersonsena%2Fclean-arch-pokemon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dersonsena%2Fclean-arch-pokemon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dersonsena%2Fclean-arch-pokemon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dersonsena","download_url":"https://codeload.github.com/dersonsena/clean-arch-pokemon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244047631,"owners_count":20389206,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","clean-code","php","php7","pokemon"],"created_at":"2024-10-10T22:23:02.136Z","updated_at":"2025-03-17T14:07:35.722Z","avatar_url":"https://github.com/dersonsena.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Clean Architecture com Pokémon\n\nA ideia deste repositório é praticar os conceitos da Clean Architecture de um modo divertido e prático integrando uma API com uma [API de Pokémon de Terceiros](https://pokeapi.co/).\n\nAqui irei tentar replicar algumas regras do clássico jogo Pokémon Gold do Gameboy.\n\n![Pokémon Gold Logo](./docs/pokemon-gold.png)\n\n## Pré-Requisitos\n\n- PHP 7.4 ou superior;\n- [Composer](https://getcomposer.org);\n- [Docker](https://www.docker.com);\n\n## Tecnologias\n\n- [Slim Framework 4](https://www.slimframework.com);\n- Migrations com [PHINX](https://phinx.org);\n- Cache com [Redis](https://redis.io);\n- Especificação de Respostas JSON com [JSend](https://github.com/omniti-labs/jsend);\n- Container Injeção de Dependência com [PHPDI](https://php-di.org);\n\n## Desenho Macro da Arquitetura\n\nMontei um diagrama mostrando como está arquitetado a aplicação baseado nos meus estudos e no meu entendimento da Clean Architecture. Esse diagrama pode ser atualizado (e com certeza será) no decorrer do desenvolvimento desse estudo:\n\n![Arquitetura App](./docs/brainstorms/clean-arch-app-flow.png)\n\n# Camadas e Decisões\n\n## Domain | Entities (Camada Amarela)\n\nDefinição do autor:\n\n\u003e As Entidades reúnem as **Regras Cruciais de Negócios** da empresa inteira. Uma entidade pode ser um objeto com métodos ou um conjunto de estruturas de dados e funções. Isso não importa, contanto que as entidades possam ser usadas por muitas aplicações diferentes na empresa e são os objetos de negócios da aplicação.\n\u003e \n\u003e Elas concentram as regras mais gerais e de nível mais alto. No mínimo, são propensas a mudar quando ocorrer alguma mudança externa. Por exemplo, você não gostaria que esses objetos fossem impactados por uma mudança na navegação de página ou na segurança. Nenhuma mudança operacional em qualquer aplicação específica deve influenciar a camada da entidade.\n\u003e \n\u003e *Fonte: Clean Architecture Book (Página 204)*\n\nUma prática que utilizei aqui é que toda Entity deverá ter sua própria Factory, pois não se sabe como as entitdades podem ser criadas no futuro. As factories nos permite ter essa flexibilidade.\n\nUm exemplo prático pode ser visto no [BattleFactory](src/Battle/Domain/Factory/BattleFactory.php).\n\n## Use Cases (Camada Vermelha)\n\nDefinição do autor:\n\n\u003e O software da camada de casos de uso contém as **regras de negócio específicas** da aplicação. Ele reúne e implementa todos os casos de uso do sistema. Esses casos de uso orquestram o fluxo de dados para e a partir das entidades e orientam essas entidades na aplicação das Regras Cruciais de Negócios a fim de atingir os objetivos do caso de uso.\n\u003e \n\u003e Não queremos que as mudanças nessa camada afetem as entidades. Também não queremos que essa camada seja afetada por mudanças em externalidades como a base de dados, a UI ou qualquer framework comum. A camada de casos de uso deve ser isolada dessas preocupações. Contudo, esperamos que mudanças na operação da aplicação afetem os casos de uso e, portanto, o software dessa camada.\n\u003e \n\u003e *Fonte: Clean Architecture Book (Página 204)*\n\nOs use cases são separados por suas respectivas pastas e devem ter pelo menos 3 classes:\n\n- `UseCase.php`: classe principal onde será implementado o caso de uso;\n- `InputBoundary.php`: um [DTO](https://pt.wikipedia.org/wiki/Objeto_de_Transfer%C3%AAncia_de_Dados) que representa os dados que serão passados para o caso de uso;\n- `OutputBoundary.php`: um [DTO](https://pt.wikipedia.org/wiki/Objeto_de_Transfer%C3%AAncia_de_Dados) que representa os dados de saída que o caso de uso deverá retornar;\n\nDentro dessa camada também terá os contratos necessários para que as camadas mais externas possam se comunicar com esta.\n\n## Adapters | Interface Adapters (Camada Verde)\n\nDefinição do autor:\n\n\u003e O software da camada de adaptadores de interface consiste em um conjunto de adaptadores que **convertem dados no formato que é mais conveniente para os casos de uso e entidades**, para o formato mais conveniente para algum agente externo como a base de dados ou a web.\n\u003e\n\u003e  Os apresentadores (Presenters), visualizações e controladores (Controllers) pertencem à camada de adaptadores de interface. Os modelos provavelmente são apenas estruturas de dados transmitidas dos controladores para os casos de uso e, então, dos casos de uso para os apresentadores e visualizações.\n\u003e \n\u003e De maneira similar, os dados dessa camada são convertidos da forma mais conveniente para entidades e casos de uso para a forma mais conveniente para o framework de persistência em uso (por exemplo, a base de dados).Nenhum código interno desse círculo deve saber nada sobre a base de dados.\n\u003e \n\u003e Fluxo do controle: ele começa no controlador (Controller), passa pelo caso de uso (Use Case) e, então, acaba sendo executado no apresentador (Presenter).\n\u003e \n\u003e *Fonte: Clean Architecture Book (Página 205)*\n\nNessa camada estarão as implementações e adaptações necessárias para que a camada de Use Cases e Entities possam se comunicar com o mundo externo.\n\n## Infra | Frameworks and Drivers (Camada Azul)\n\nDefinição do autor:\n\n\u003e A camada mais externa e é geralmente composta de frameworks e ferramentas como a base de dados e o framework web. Em geral, você não programa muita coisa nessa camada além do código de associação que estabelece uma comunicação com o círculo interno seguinte.\n\u003e \n\u003e Todos os detalhes ficam na camada de frameworks e drivers. A web é um detalhe. A base de dados é um detalhe. Mantemos essas coisas do lado de fora, onde não podem fazer mal nenhum.\n\u003e \n\u003e *Fonte: Clean Architecture Book (Página 205)*\n\nAqui terão as classes que farão acesso ao mundo externo: Frameworks, bibliotecas, UI, WEB, CLI e etc.\n\n## Referências e Links\n\n- [Introdução a Arquitetura de Software](https://blog.taller.net.br/introducao-a-arquitetura-de-software)\n- [Clean Architecture I – Overview](https://blog.taller.net.br/clean-architecture-overview)\n- [erandirjunior/vehicle-backend](https://github.com/erandirjunior/vehicle-backend)\n- [erandirjunior/fortbrasil-backend](https://github.com/erandirjunior/fortbrasil-backend)\n- [rmanguinho/clean-ranking-loader](https://github.com/rmanguinho/clean-ranking-loader)\n- [In Clean Architecture, where to put validation logic?](https://ikenox.info/blog/where-to-put-validation-in-clean-architecture/#:~:text=Just%20as%20Clean%20Architecture%20splits,differrent%20depending%20on%20its%20context.)\n- [REST, GraphQL, Clean Architecture e TypeScript com Rodrigo Manguinho // Live #69](https://www.youtube.com/watch?v=P0gpCCA8ZPs)\n\n## Casos de Uso\n\nAbaixo estão listadas os casos de uso para termos uma ideia fechada de Domínio e Regras de Negócios:\n\n- [Iniciar uma Batalha (Battle Start)](./docs/usecases/battle-start);\n- [Capturar um Pokémon (Catch Pokemon)](./docs/usecases/catch-pokemon);\n- [Informações do Jogador (Player Info)](./docs/usecases/player-info);\n- [Comprar Items (Purchase)](./docs/usecases/purchase);\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdersonsena%2Fclean-arch-pokemon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdersonsena%2Fclean-arch-pokemon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdersonsena%2Fclean-arch-pokemon/lists"}