PHPackages                             yurigabriel/myframework - 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. [Framework](/categories/framework)
4. /
5. yurigabriel/myframework

ActiveProject[Framework](/categories/framework)

yurigabriel/myframework
=======================

A little project

v1.0.2(4mo ago)021[3 issues](https://github.com/Yuri-Gabriel/MyFramework/issues)MITPHPPHP &gt;=8.0

Since Dec 27Pushed 4mo agoCompare

[ Source](https://github.com/Yuri-Gabriel/MyFramework)[ Packagist](https://packagist.org/packages/yurigabriel/myframework)[ RSS](/packages/yurigabriel-myframework/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (1)Versions (5)Used By (0)

MyFramework — Documentação Completa
===================================

[](#myframework--documentação-completa)

Este README descreve como usar os principais componentes do framework: Controllers, Middlewares, Models, Repositories, QueryBuilder e como configurar o Kernel (variáveis de ambiente e conexão com o banco). Também inclui um tutorial passo-a-passo para criar um novo módulo.

**Sumário**

- **Controllers**
- **Middlewares**
- **Models &amp; Repositories**
- **QueryBuilder**
- **Kernel / Configuração (.env)**
- **Tutorial: criar um novo módulo**

**Controllers**
---------------

[](#controllers)

- **O que são**: Classes anotadas com `#[Controller]`. Métodos dentro do controller são rotas quando anotados com `#[Mapping(path, httpMethod)]`.
- **Injeção de dependência**: Propriedades públicas anotadas com `#[Instantiate]` são instanciadas automaticamente (ex.: `Request`, `Response`, repositórios).
- **Exemplo**: [app/controller/Main.php](app/controller/Main.php)

**Middlewares**
---------------

[](#middlewares)

- **O que são**: Classes anotadas com `#[Middleware]` que implementam `Interceptable` (método `rule(): bool`).
- **Aplicação**: Use `#[Interceptors([YourMiddleware::class])]` em um controller ou método para aplicar regras antes da execução da rota.
- **Exemplo**: [app/middleware/Bearer.php](app/middleware/Bearer.php)

**Models &amp; Repositories**
-----------------------------

[](#models--repositories)

- **Models**: Marcados com `#[Model("table_name")]`. Campos usam `#[Collumn]`, `#[PrimaryKey]` e outras anotações de banco.
- **Repositories**: Estendem `Framework\Libs\DataBase\Repository` e recebem a `Model::class` no construtor; fornecem acesso ao `QueryBuilder` para operações.
- **Exemplos**: [app/model/User.php](app/model/User.php) e [app/repository/UserRepository.php](app/repository/UserRepository.php)

**QueryBuilder — visão geral**

- Implementado em `Framework\Libs\DataBase\Query`. Principais classes:
    - `QueryBuilder` — pontos de entrada (`select`, `insert`, `update`, `delete`).
    - `SelectBuilder`, `InsertBuilder`, `UpdateBuilder`, `DeleteBuilder` — constroem a query em cadeia.
    - `WhereQueryBuilder` — auxilia a construção de cláusulas WHERE com métodos `and`, `or`, `isNull`, `notNull`.

**Exemplos práticos (QueryBuilder)**

- SELECT com WHERE, JOIN, ORDER BY e LIMIT

```
$data = $this->userRepository
    ->select(['u.id', 'u.username', 'p.name'])
    ->innerJoin('profile p', 'p.user_id', '=', 'u.id')
    ->where(function($w) {
        $w->and('u.active', '=', 1)
          ->and('u.username', '!=', 'guest')
          ->or('u.role', '=', 'admin');
    })
    ->orderByDESC('u.created_at')
    ->limit(50)
    ->run();
```

- Observações sobre `WhereQueryBuilder`: ele concatena condições em SQL simples; valores string são automaticamente envoltos em aspas simples pelo builder (`'value'`).
- INSERT

```
$this->userRepository
    ->insert(['username' => 'jdoe', 'email' => 'jdoe@example.com', 'password' => 'hash'])
    ->run();
```

- UPDATE

```
$this->userRepository
    ->update(['username' => "'newname'", 'email' => "'new@example.com'"])
    ->where(function($w) {
        $w->and('id', '=', 10);
    })
    ->run();
```

- DELETE

```
$this->userRepository
    ->delete(['id' => 10])
    ->run();
```

- Observações importantes sobre segurança:
    - O builder corrente monta SQL concatenando valores; não há binding de parâmetros na implementação atual — cuide contra SQL injection.
    - Para dados vindos de usuários, sanitize/escape ou estenda o `Repository`/`Conection` para usar prepared statements com parâmetros.

**Kernel &amp; configuração (.env)**

- O carregamento de variáveis de ambiente é feito por `Framework\Kernel\EnvLoad` lendo o arquivo `.env` na raiz do projeto. Regras básicas:

    - Cada linha no formato `KEY=VALUE` (aspas simples ou duplas são suportadas e removidas).
    - Linhas começando com `#` são tratadas como comentários.
    - As variáveis são atribuídas em `$_ENV`.
- Variáveis obrigatórias para conexão com banco (usadas por `Framework\Libs\DataBase\Conection`):

    - `DB_CONNECTION` (ex.: `mysql`)
    - `DB_HOST`
    - `DB_PORT`
    - `DB_DATABASE`
    - `DB_USERNAME`
    - `DB_PASSWORD`
- Exemplo de `.env` mínimo:

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=myuser
DB_PASSWORD=secret
```

- O `Kernel` utiliza `ClassLoader::load('/app')` para carregar classes do diretório `app` e, em seguida, executa kernels (ex.: `ModelKernel`, `RoutesKernel`) que registram modelos e rotas.

**Tutorial: criar um novo módulo (Controller + Model + Repository + Middleware)**
---------------------------------------------------------------------------------

[](#tutorial-criar-um-novo-módulo-controller--model--repository--middleware)

1. Criar o Model

- Arquivo: [app/model/Product.php](app/model/Product.php)

```
