PHPackages                             jot/hf-repository - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. jot/hf-repository

ActiveLibrary[Search &amp; Filtering](/categories/search)

jot/hf-repository
=================

Projects related entities and repositories for elasticsearch mappings

v0.15.57(11mo ago)07171MITPHPPHP &gt;=8.2

Since Apr 13Pushed 11mo ago1 watchersCompare

[ Source](https://github.com/JotJunior/hf-repository)[ Packagist](https://packagist.org/packages/jot/hf-repository)[ RSS](/packages/jot-hf-repository/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (14)Versions (42)Used By (1)

hf-repository
=============

[](#hf-repository)

O **hf-repository** é uma library extensível para gerenciamento de dados, oferecendo uma camada de abstração baseada no conceito de **Repositories**. Ele foi projetado para trabalhar de forma eficiente com o Elasticsearch, utilizando o padrão de design **Repository Pattern** para isolar a lógica de acesso aos dados. Simplifica a interação com índices, facilita o mapeamento de resultados para entidades e fornece suporte confiável para operações CRUD, busca avançada, paginação e geração de consultas dinâmicas.

---

Recursos Principais
-------------------

[](#recursos-principais)

- **Abstração de Repositórios**: Camada central para comunicação com o Elasticsearch.
- **CRUD Completo**: Operações básicas para criar, buscar, atualizar e remover itens.
- **Paginação Simplificada**: Paginador nativo com alta personalização de parâmetros.
- **Mapeamento de Entidades**: Integra resultados aos objetos do domínio do projeto.
- **Flexibilidade de Consultas**: Filtros, ordenações e seleção de atributos via consulta.
- **Fácil Extensão**: Estrutura modular para criação de repositórios específicos.
- **Gerador de código**: Comandos inteligentes para criar as entidades, repositórios e controladores, construindo um CRUD completo para as chamadas de API.

---

Estrutura do Projeto
--------------------

[](#estrutura-do-projeto)

O projeto segue uma arquitetura limpa e bem organizada:

- **Entidades ([Entity](docs/entity.md))**: Representam os dados do negócio e oferecem funcionalidades para manipulação e hidratação de valores.
- **Repositórios ([Repository](docs/repository.md))**: Realizam todas as interações com a camada de dados, encapsulando as operações.
- **Construtor de Consultas (`QueryBuilder`)**: Fornece suporte à criação e execução de consultas dinâmicas no Elasticsearch.

---

Tecnologias Utilizadas
----------------------

[](#tecnologias-utilizadas)

- **Hyperf Framework**: Utilizado como base para o projeto, com suporte ao paradigma reativo e arquitetura moderna.
- **Elasticsearch**: Banco de dados NoSQL utilizado para indexação e busca avançada.
- **Redis**: Armazenamento em memória de alta performance utilizado para caching, controle do rate-limit e gerenciamento de sessões, otimizando a eficiência e performance do sistema.
- **PSR-11 (Container)**: Integração do padrão de contêiner de dependências para maior compatibilidade.
- **PHP 8.1+**: Versão mínima do PHP, aproveitando recursos modernos como atributos e tipagem forte.

---

Instalação
----------

[](#instalação)

Para integrar o **hf-repository** no seu projeto Hyperf adicione as dependências necessárias ao seu projeto (via composer):

```
composer require jot/hf-repository
```

Após a instalação, publique os arquivos de configuração das dependências necessárias:

```
php bin/hyperf.php vendor:publish hyperf/redis
php bin/hyperf.php vendor:publish hyperf/rate-limit
php bin/hyperf.php vendor:publish hyperf/swagger
php bin/hyperf.php vendor:publish jot/hf_elastic
```

Exemplo de Uso
--------------

[](#exemplo-de-uso)

O comando mais importante desta biblioteca é a criação de um CRUD completo a partir de um índice do Elasticsearch.

O comando `repo:crud` vai criar as classes de entidades, repositório e controlador, além de já preparar toda a documentação do swagger e aplicar um rate limit padrão de 10 requisições por segundo.

```
php bin/hyperf.php repo:crud --index=orders
```

```
You are about to create a CRUD for index orders with api version v1.
The elasticsearch index related entities, repository and controller will be created during this process.

Are you sure you want to create a CRUD for index orders? [Y/n] [Y]:

Creating the CRUD for index orders...

Start creating entities...
+ [OK] ./app/Entity/Order/Customer.php
+ [OK] ./app/Entity/Order/Invoice.php
+ [OK] ./app/Entity/Order/Item.php
+ [OK] ./app/Entity/Order/OrderHistory.php
+ [OK] ./app/Entity/Order/Payment.php
+ [OK] ./app/Entity/Order/Shipment.php
+ [OK] ./app/Entity/Order/Order.php

Start creating repository...
+ [OK] ./app/Repository/OrderRepository.php

Start creating controller...
+ [OK] ./app/Controller/V1/OrderController.php
```

Os detalhes de cada classe gerada por este comando serão explicadas no próximo tópico.

Criando as classes individualmente
----------------------------------

[](#criando-as-classes-individualmente)

Para criar individualmente as classes necessárias, siga os comandos na ordem abaixo:

### 1. Criando dinamicamente as classes das entidades

[](#1-criando-dinamicamente-as-classes-das-entidades)

Utilize o comando de console `repo:entity` para gerar as entidades relacionadas ao índice.

```
php bin/hyperf.php repo:entity --index=orders
```

```
+ [OK] ./app/Entity/Order/Customer.php
+ [OK] ./app/Entity/Order/Invoice.php
+ [OK] ./app/Entity/Order/Item.php
+ [OK] ./app/Entity/Order/OrderHistory.php
+ [OK] ./app/Entity/Order/Payment.php
+ [OK] ./app/Entity/Order/Shipment.php
+ [OK] ./app/Entity/Order/Order.php
```

Conforme demonstrado, o comando vai analisar o mapping do índice informado e vai criar a entidade principal do índice e caso haja objetos e objetos nested no índice, uma classe de entidade será gerada para cada um deles.

Cada classe gerada já vem aplicada com as configurações do Swagger, criando as referências necessárias para a documentação do projeto.

```
