> For the complete documentation index, see [llms.txt](https://jjrdev.gitbook.io/luna/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jjrdev.gitbook.io/luna/o-basico/controllers.md).

# Controllers

Toda requisição recebida na rota deve (ou deveria) passar por um controller para que enfim retorne ao usuário os dados solicitados ou a view necessária, sendo assim os controllers devem ser criados para tratar a requisição corretamente.

É possível cria-los no diretório `/app/Controllers` com subpastas para um melhor controle:

```php
namespace App\Controllers\Product;

class Product {
    public static function getProduct($request, $response) {
        // ...
    }
}
```

### Obtendo dados da requisição

Os dados da requisição, como *headers*, *parâmetros query*, *variáveis post*,  *parâmetros de url*, *uri* e *método http* podem ser obtidos com a variável `$request`:

```php
$request->header(); // Obter parâmetros do header
$request->query(); // Obter parâmetros da query
$request->body(); // Obter parâmetros do corpo
$request->param(); // Obter parâmetros da URL

$request->getUri(); // Obter URI
$request->getHttpMethod(); // Obter método HTTP
```

{% hint style="info" %}
É possível obter parâmetros específicos com as funções: `$request->query('id')`. Não especificar um parâmetro fará com que todos sejam retornados em `array`.
{% endhint %}

### Respondendo a requisição

Toda requisição espera uma resposta, sendo ela problemática ou não, por isso é necessário que todo controller possua um `return $res->send()` com informações da resposta:

```php
namespace App\Controllers\Product;

class Product {
    public static function getProduct($request, $response) {
        $return->send(200, "Sucesso");
    }
}
```

Os status (*200* *no exemplo*) da resposta deve seguir os padrões de status http listados [aqui](https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status).

### Padrão de retorno

O padrão de retorno pode ser definido na configuração no arquivo `.env` e é pré-definida para o formato `text/html` mas pode ser modificado dependendo de como for necessário:

```php
public static function getProduct($request, $response) {
    // ...
    $return->send(200, ["data" => "Sucesso"], "application/json");
}
```

É possível também utilizar *alias* para o retorno da requisição em **HTML** ou **JSON**:

```php
$res->send(200, $content, 'json'); // Ao invés de 'application/json'
$res->send(200, $content, 'html'); // Ao invés de 'text/html'
```
