Docs›Services›MadRequest
Services

MadRequest

Acesso a parâmetros HTTP via DI ou static API.

Mad\Http\MadRequest dá acesso tipado a parâmetros HTTP — instanciável (injeção via type-hint em mount()/actions) ou via API estática consultável de qualquer lugar (views, services, helpers). Inspirado no Request do Laravel, mas mais enxuto e pensado para o ciclo de vida reativo do MadComponent.

Esta página é a referência da classe

Para o padrão de uso recomendado dentro de formulários (promover parâmetro de URL a prop pública em mount()), ver Formulários → MadRequest.

API de instância (injeção via DI)

Recebida com type-hint em mount() ou em qualquer action — o framework injeta automaticamente os dados do request atual:

use Mad\Http\MadRequest;

class NegociacaoForm extends MadComponent
{
    public int $negociacaoId = 0; // prop pública — sobrevive ao ciclo reativo (MadWire)

    public function mount(MadRequest $request): void
    {
        $this->negociacaoId = $request->int('negociacao_id');
        $nome                = $request->string('nome', 'Sem nome');
        $ativo                = $request->bool('ativo', true);
    }
}
MétodoRetornoDescrição
get($key, $default = null)mixedValor cru, sem cast.
int($key, $default = 0)intCast para inteiro.
string($key, $default = '')stringCast para string.
float($key, $default = 0.0)floatCast para float.
bool($key, $default = false)boolfilter_var(..., FILTER_VALIDATE_BOOLEAN) — aceita '1', 'true', 'on', 'yes'.
has($key)boolExiste e não é vazio (!empty()).
exists($key)boolExiste, mesmo que vazio/null.
all()arrayTodos os dados.
only(['a','b'])arraySubconjunto pelas chaves.
except(['x'])arrayTudo exceto essas chaves.
files($key)UploadedFile[]Arquivos enviados no campo, sempre como lista 0..N. Campo ausente → [].
file($key)UploadedFile|nullPrimeiro arquivo do campo (espelha Request::file() do Laravel).
hasFile($key)booltrue quando o campo trouxe ao menos um arquivo válido.
Arquivos: na maioria dos casos você NÃO precisa de files()

O wire (mad-livewire.js) coleta todo input[type=file] do wrapper no FormData, então $_FILES chega na action mesmo num mad:click — files()/file()/hasFile() existem para ler isso sem mexer em $_FILES cru. Ainda assim, o caminho normal é declarar <mad-file-field>/<mad-multi-file-field> com storage/model e chamar $this->form->save($registro): o framework grava disco/banco, trata remoção na edição e sanitiza o nome. Use os helpers só quando o destino do arquivo é fora do padrão (API externa, parser em memória).

Também suporta acesso como propriedade — $request->nome equivale a $request->get('nome') (via __get/__isset), sem cast e sem default customizável.

API estática (acesso global)

Útil fora do mount() — dentro de uma view Blade, um service, um helper, ou uma action chamada via MadWire onde o request original não está mais disponível por DI:

use Mad\Http\MadRequest;

// Em qualquer lugar — Blade, service, helper, outro componente
MadRequest::getInt('negociacao_id');
MadRequest::getString('nome', 'default');
MadRequest::hasParam('id');
MadRequest::allParams();
Método estáticoRetornoDescrição
param($key, $default = null)mixedValor cru.
getInt($key, $default = 0)intCast para inteiro.
getString($key, $default = '')stringCast para string.
getFloat($key, $default = 0.0)floatCast para float.
getBool($key, $default = false)boolMesma regra de bool() de instância.
hasParam($key)boolExiste e não é vazio.
allParams()arrayMerge de $_REQUEST capturado + todas as props públicas escalares do componente ativo.
capture(array $data)voidSobrescreve/injeta dados capturados — usado em testes ou boot manual.
reset()voidLimpa o cache capturado — usar em testes (tearDown).

Ordem de lookup do static

A API estática procura em duas fontes, nesta ordem:

  1. Prop pública do MadComponent ativo (via MadRenderContext::getComponent()) — só usada se o valor for "truthy" (não null/''/0/'0'), senão cai na fonte 2. Sobrevive ao ciclo reativo do MadWire porque entra no state serializado.
  2. $_REQUEST capturado (lazy, na primeira chamada) — só reflete os parâmetros do primeiro GET/POST que abriu a página; numa action disparada pelo wire depois, $_REQUEST contém apenas mad_state/mad_action, não mais os parâmetros originais.
class NegociacaoForm extends MadComponent
{
    public int $negociacaoId = 0; // ← promovido a prop em mount()

    public function mount(MadRequest $request): void
    {
        $this->negociacaoId = $request->int('negociacao_id');
    }

    public function onSave(): MadResponse
    {
        // No wire (action disparada depois do mount inicial), $_REQUEST NÃO
        // tem mais 'negociacao_id' — só mad_state/mad_action. Mas a prop
        // pública sobreviveu no state, então o static accessor a encontra:
        $id = MadRequest::getInt('negociacao_id');
        // ...
    }
}
Promova o parâmetro a prop pública no mount()

Se um parâmetro de URL precisa estar disponível em actions disparadas depois (não só no primeiro render), atribua-o a uma prop pública dentro de mount(). Caso contrário, o lookup estático cai no $_REQUEST capturado, que não reflete mais o parâmetro original após a primeira requisição.

Para testes

capture()/reset() permitem injetar dados fake sem precisar montar um request HTTP real:

use Mad\Http\MadRequest;

class MeuComponenteTest extends TestCase
{
    public function test_promove_param_para_prop(): void
    {
        MadRequest::capture(['id' => 42, 'tipo' => 'A']);

        $componente = new MeuComponente();
        $componente->mount();

        $this->assertSame(42, $componente->id);

        MadRequest::reset(); // limpa o cache estático entre testes
    }
}

Próximos passos