{"id":23180838,"url":"https://github.com/williamkoller/ddd-php","last_synced_at":"2025-04-05T03:13:33.205Z","repository":{"id":268630373,"uuid":"904985002","full_name":"williamkoller/ddd-php","owner":"williamkoller","description":"Domain Driven Design - PHP","archived":false,"fork":false,"pushed_at":"2024-12-18T00:27:00.000Z","size":24,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T08:02:17.775Z","etag":null,"topics":["best-practices","composer","ddd","ddd-architecture","ddd-example","php","php7","php74","psr-4","solid-principles"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/williamkoller.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-12-17T23:40:23.000Z","updated_at":"2025-01-14T18:05:10.000Z","dependencies_parsed_at":"2024-12-18T00:35:04.073Z","dependency_job_id":"606b62d5-ee47-4c36-9c82-685f011a1ebd","html_url":"https://github.com/williamkoller/ddd-php","commit_stats":null,"previous_names":["williamkoller/ddd-php"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Fddd-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Fddd-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Fddd-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Fddd-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/williamkoller","download_url":"https://codeload.github.com/williamkoller/ddd-php/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247280272,"owners_count":20912967,"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":["best-practices","composer","ddd","ddd-architecture","ddd-example","php","php7","php74","psr-4","solid-principles"],"created_at":"2024-12-18T08:13:27.313Z","updated_at":"2025-04-05T03:13:33.134Z","avatar_url":"https://github.com/williamkoller.png","language":"PHP","readme":"# DDD PHP - Projeto de Exemplo\n\nDDD PHP - Arquitetura e Estrutura de Diretórios\nEste projeto segue os princípios do Domain-Driven Design (DDD), um padrão arquitetural que visa organizar o código com base no domínio do negócio. A estrutura de diretórios foi pensada para refletir esses conceitos, facilitando a manutenção e escalabilidade do sistema.\n## Requisitos\n\nPHP: 7.4\nComposer: 2.x ou superior\n\n## Estrutura de Diretórios\nA estrutura do projeto segue o padrão do Domain-Driven Design (DDD) e usa o autoloading do Composer para carregar as classes automaticamente.\n\n\n```bash\n/ddd-php\n  /domain\n    /Entities\n    /Exceptions\n    /Factories\n    /Repositories\n      /Implementation\n      /OrderRepository.php\n    /Services\n    /Usecases\n    /Value-objects\n  /vendor\n  /composer.json\n  /execute.php\n\n```\n\n## Configuração do Autoloading no composer.json\nO arquivo composer.json está configurado para utilizar o autoloading no padrão PSR-4, o que significa que todas as classes no namespace Domain são mapeadas para o diretório domain/ do projeto.\n\n```json\n{\n  \"autoload\": {\n    \"psr-4\": {\n      \"Domain\\\\\": \"domain/\"\n    }\n  }\n}\n\n```\n\n## Como Rodar o Projeto\n1. Instalar Dependências\n   Primeiro, instale as dependências do Composer:\n\n```bash\ncomposer install\n```\n\nIsso irá instalar todas as dependências necessárias e criar o diretório vendor.\n\n2. Gerar Arquivos de Autoload\n   O Composer gera automaticamente um arquivo de autoload, mas pode ser necessário gerar o autoload otimizado para garantir que todas as classes sejam carregadas corretamente.\n\nExecute o comando abaixo para gerar os arquivos de autoload:\n\n```bash\ncomposer dump-autoload -o\n```\n\n3. Rodar o Projeto\n   Após as dependências serem instaladas e o autoload ser configurado, você pode executar o script execute.php para testar a execução do projeto:\n\n```bash\nphp execute.php\n      \nSaída:\n\nOrdem com ID: 1234 salva.\nOrdem criada com ID: 1234\n\n\n```\n\n# Estrutura do Projeto\nA estrutura do seu projeto está organizada da seguinte maneira:\n\n### 1. /domain\n   O diretório /domain contém o núcleo do seu sistema, o \"domínio\". Este é o lugar onde as regras de negócios e a lógica central do sistema são implementadas, isoladas de detalhes como infraestrutura e interfaces de usuário. A pasta /domain está estruturada de forma a refletir as várias camadas do DDD.\n\n### 2. /entities\nAs entidades representam objetos com identidade própria, geralmente com um ciclo de vida contínuo. Elas contêm a lógica de negócios associada e são persistidas no banco de dados.\n\n`Exemplo: Order.php, Product.php`\nEntidades podem ter comportamentos complexos associados, como regras de validação ou operações que afetam seu estado.\n\n### 3. /exceptions\nEste diretório contém as exceções específicas do domínio, que são lançadas quando ocorre algum erro dentro da lógica de negócios. As exceções personalizadas ajudam a tornar o sistema mais robusto e expressivo, permitindo que erros de negócios sejam tratados de forma apropriada.\n\n`Exemplo: InvalidDiscountException.php, InvalidPriceException.php`\n\n### 4. /factories\nAs fábricas são responsáveis pela criação de objetos complexos. Elas encapsulam a lógica de criação de instâncias de objetos do domínio, garantindo que todas as dependências sejam corretamente injetadas.\n\n`Exemplo: OrderFactory.php`\n\n### 5. /repositories\nOs repositórios são responsáveis por abstrair o acesso e manipulação dos dados persistidos. Eles fornecem métodos para buscar, armazenar e remover entidades do banco de dados. No DDD, o repositório permite que o domínio se concentre na lógica de negócios, sem se preocupar com detalhes de implementação do armazenamento de dados.\n\n`Exemplo: OrderRepositoryInterface.php, ProductRepositoryInterface.php`\n\n### 6. /implementation\nEste subdiretório contém as implementações dos repositórios definidos nas interfaces. Aqui, você pode ter implementações que interagem com diferentes fontes de dados, como bancos de dados relacionais, NoSQL, APIs externas, etc.\n\n`Exemplo: OrderRepository.php (implementação do repositório)`\n\n### 7. /services\nOs serviços de domínio contêm a lógica de negócios que não pertence a uma entidade ou valor específico. Esses serviços são usados quando a operação envolve mais de uma entidade ou complexidade que justifica ser tratada em um serviço separado.\n\n`Exemplo: OrderDiscountService.php`\n\n### 8. /usecases\nOs casos de uso representam as operações principais do sistema que o usuário ou o sistema chama para executar uma ação. Cada caso de uso reflete uma ação específica ou um processo do domínio que é central para o funcionamento do sistema.\n\n`Exemplo: CreateOrderUseCase.php`\nEsses arquivos contêm a orquestração da lógica de negócios e frequentemente interagem com as entidades e os repositórios para realizar operações completas.\n\n### 9. /value-objects\nOs objetos de valor representam conceitos do domínio que não têm identidade própria, mas são importantes para a lógica de negócios. Eles são imutáveis e podem ser usados como parte de entidades ou serviços.\n\n`Exemplo: Price.php, Discount.php`\n\n### 10. /vendor\n   O diretório /vendor contém todas as dependências do projeto, que são gerenciadas pelo Composer. Esse diretório é criado automaticamente após a execução de composer install.\n\n### 11. composer.json\n   O arquivo composer.json contém as configurações do Composer, incluindo dependências, autoloading e outras configurações importantes. Ele usa o padrão PSR-4 para autoloading, que mapeia o namespace Domain\\ para o diretório domain/, permitindo que o Composer carregue automaticamente as classes.\n\n### 12.execute.php\n   O arquivo execute.php é onde a execução do projeto ocorre. Esse arquivo pode ser usado para orquestrar a execução de casos de uso ou iniciar o processo de interação com o sistema. Ele pode chamar serviços, repositórios ou casos de uso diretamente, dependendo da lógica do sistema.\n\n# Como Funciona a Arquitetura\n## Domínio Centralizado\nNo DDD, o domínio é o foco principal. Isso significa que as entidades, exceções, serviços, repositórios e casos de uso estão todos organizados ao redor da lógica de negócios. O código de infraestrutura, como persistência de dados, comunicação de rede ou interfaces de usuário, é separado do domínio, o que garante que a lógica de negócios possa evoluir sem ser afetada por esses detalhes.\n\nEntidades encapsulam dados e regras de negócios.\n\nExceções lidam com erros específicos do domínio.\nRepositórios fornecem abstrações para o armazenamento de dados.\n\nServiços de Domínio são usados para lógica complexa.\n\nCasos de Uso orquestram as operações principais do sistema, utilizando os repositórios e serviços.\n\nIsolamento do Domínio\nAo adotar o DDD, garantimos que o domínio permaneça isolado de detalhes de implementação como banco de dados, API ou interface com o usuário. \n\nA comunicação com o mundo exterior ocorre através de casos de uso, que implementam a lógica necessária para orquestrar as interações entre o domínio e os serviços externos.\n\n# PSR-4 Autoloading\nA arquitetura usa o PSR-4 para autoloading, onde o Composer carrega automaticamente as classes com base nos namespaces. Isso significa que o PHP encontra e carrega as classes de acordo com o caminho do diretório, sem a necessidade de incluir manualmente os arquivos. O arquivo composer.json está configurado para usar o autoloading de PSR-4, permitindo que você defina namespaces para organizar melhor as classes dentro do seu projeto.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamkoller%2Fddd-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwilliamkoller%2Fddd-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamkoller%2Fddd-php/lists"}