# Correção: boot em produção (Debugbar) e leitura de `config.json`

- **Commit:** `11810cd53020bcaefedada72b1ab2ebab5b19707`
- **Arquivos:** `config/app.php`, `config/mail.php`, `config/recaptcha.php`,
  `app/Providers/AppServiceProvider.php`, `.env.example`, `bootstrap/cache/.gitignore`
- **Categoria:** deploy / robustez de boot em produção (`--no-dev`)

Este commit agrupa duas correções independentes de ambiente de produção.

---

## A. Provider do Debugbar quebrava o boot em produção

### A.1 Problema
A aplicação não subia em produção (`composer install --no-dev`), com erro de
classe inexistente ao carregar o service provider do Debugbar. Confirmado em
`storage/logs/laravel.log`:

> `Unable to load provider Barryvdh\Debugbar\ServiceProvider`

### A.2 Causa real
`Barryvdh\Debugbar` é dependência de **`require-dev`**. Estava listado
fixamente no array `providers` de `config/app.php`, então o Laravel tentava
instanciá-lo em produção, onde a classe **não existe** (foi descartada pelo
`--no-dev`) → fatal no boot.

### A.3 Correção real
- Removido de `config/app.php` (`providers`).
- Registro condicional em `app/Providers/AppServiceProvider.php`, só quando a
  classe está presente:

```php
public function register(){
    // Debugbar é dependência de desenvolvimento (require-dev); em produção
    // (composer install --no-dev) a classe não existe e não deve quebrar o boot.
    if (class_exists(\Barryvdh\Debugbar\ServiceProvider::class)) {
        $this->app->register(\Barryvdh\Debugbar\ServiceProvider::class);
    }
}
```

Resultado: em dev o Debugbar carrega; em produção é ignorado sem quebrar.

---

## B. `config.json` ausente gerava fatal em app/mail/recaptcha

### B.1 Problema
Em instalação nova, ou em produção **antes do primeiro salvamento** da
categoria "site" das configurações, a aplicação quebrava ao montar as
configurações de `app`, `mail` e `recaptcha`.

### B.2 Causa real
`config/app.php`, `config/mail.php` e `config/recaptcha.php` liam
`base_path('config.json')` e acessavam propriedades do objeto decodificado:

```php
$json = file_get_contents(base_path()."/config.json");
$data = json_decode($json);
$app_config = $data->config[2];          // <- $data é null se o arquivo não existe
'env' => $app_config->app_env,           // <- fatal: ler propriedade de null
```

O `config.json` é **gerado em runtime** (pelo save da categoria "site" em
`ConfigurationController::updateByCategory`, via
`file_put_contents(base_path().'/config.json', $json)`). Se o arquivo não
existe (deploy novo / produção virgem), `file_get_contents` retorna `false`,
`json_decode(false)` → `null`, e o acesso `->config[2]`/`->app_env` lança erro
fatal ("Trying to get property ... of non-object").

### B.3 Correção real
Leitura tolerante a arquivo ausente + fallback para `env()` quando o JSON não
estiver disponível (mesmo padrão aplicado em `app`, `mail` e `recaptcha`):

```php
$json = @file_get_contents(base_path('config.json'));
$data = $json ? json_decode($json) : null;
$app_config = ($data && isset($data->config[2])) ? $data->config[2] : null;

// ...
'env'   => $app_config ? $app_config->app_env   : env('APP_ENV', 'production'),
'debug' => $app_config ? $app_config->app_debug : env('APP_DEBUG', false),
```

Idem para `mail_driver/host/port/...` e `recaptcha_public_key/private_key`,
sempre caindo no `env()` correspondente quando `$app_config` é `null`.

### B.4 Retrocompatibilidade
Total. Quando `config.json` existe, o comportamento é idêntico ao anterior.
Quando ausente, usa os defaults de `env()` em vez de quebrar o boot.

---

## C. Outros ajustes do commit

- **`.env.example`**: `DB_HOST=127.0.0.1` → `DB_HOST=postgres` (nome do serviço
  no `docker-compose`, ambiente de dev/container).
- **`bootstrap/cache/.gitignore`**: apenas mudança de modo de arquivo
  (permissão), sem alteração de conteúdo.

## 6. Notas de deploy

- As duas correções (A e B) só afetam produção / boot; em dev o comportamento
  observado é o mesmo de antes.
- Após subir, limpar cache de config se aplicável:
  `php artisan config:clear` (e `php artisan optimize:clear` no cPanel).
