# Routers

As rotas do Luna pode ser definida pelo URI no diretório `/routes` de forma bastante simples:

```php
use \App\Controllers\Pages;

$router->get('/', [
    function($request, $response) {
        return Pages\Example::getPage($request, $response);
    }
]);
```

#### Métodos de roteador disponíveis:

```php
$router->get($uri, [$callback]);
$router->post($uri, [$callback]);
$router->put($uri, [$callback]);
$router->patch($uri, [$callback]);
$router->delete($uri, [$callback]);
$router->options($uri, [$callback]);
```

Também é possível definir múltiplos métodos para um mesmo URI e callback:

```php
$router->match(['get', 'post'], $uri, [$callback]);
$router->any($uri, [$callback]);
```

## Parâmetros de rota

As rotas podem receber parâmetros personalizados para definição de url amigáveis:

```php
$router->get('/products/{id}', [
    function($request, $response) {
        return Pages\Product::getPage($request, $response);
    }
]);
```

Os parâmetros opcionais podem ser obtidos através da `$request`:

```php
# /products/1
class Product extends Page {
    public static function getPage($request, $response) {
        $pathParams= $req->getPathParams();
        var_dump($pathParams);
        // ['id' => '1'];
    }
}
```

É recomendado que utilize o método acima para obter os parâmetros enviados pela rota, porém ainda é possível obtê-los com uma variável explicita:

```php
$router->get('/products/{id}', [
    function($id, $request, $response) {
        return Pages\Product::getPage($id, $request, $response);
    }
]);

# /products/1
class Product extends Page {
    public static function getPage($id, $request, $response) {
        var_dump($id);
        // 1
    }
}
```

### Parâmetros opcionais

Pode ser necessário especificar um parâmetro de rota que nem sempre esteja presente na requisição. Para fazer isso basta adicionar um `?` após o nome do parâmetro.

```php
$router->get('/cart/{id?}', [
    function($request, $response) {
        // ...
    }
]);

$router->get('/product/{id}/{slug?}', [
    function($request, $response) {
        // ...
    }
]);
```

{% hint style="info" %}
Parâmetros opcionais não informados na requisição serão definidos como `NULL`.
{% endhint %}

### Rotas de erros

Alguns erros comuns podem ser tratados diretamente na definição da rota para personalizar a página de retorno:

```php
use \App\Controllers\Errors;

$router->error(404, [
    function($request, $response) {
        return Errors\PageNotFound::getPage($request, $response);
    }
]);
```

Também é possível definir uma rota **padrão** para que seja apresentada em caso de erro:

```php
use \App\Controllers\Errors;

$router->error('default', [
    function($request, $response) {
        return Errors\General::getPage($request, $response);
    }
]);
```

### Rotas sem controllers

Embora não recomendável ainda é possível criar rotas que retornam diretamente sem um controller especificado:

```php
use \App\Http\Response;

$router->get('/products', [
    function() {
        return (new Response())->send(200, "Produtos");
    }
]);
```

### Redirecionamento

Para realizar um redirecionamento execute a função `redirect()` presente no objeto da rota:

```php
$request->getRouter()->redirect('/destination');
```
