Docs›Formulários›MadRequest
Formulários

MadRequest

Acesso a parâmetros via DI (instance) e static API.

MadRequest encapsula os parâmetros do request HTTP com accessors tipados — inspirado no Request do Laravel, mas resolvido por reflection em mount()/actions de MadComponent. Tem duas APIs: instância (injetada via type-hint) e estática (acesso global a partir de qualquer lugar — Blade, services, helpers).

Quando usar cada uma

CenárioUsar
mount() de MadComponent recebendo param de navegaçãoInstância via type-hint
Action que precisa ler a query string atualInstância via type-hint
Ler param dentro de BladeEstática (MadRequest::getInt(...))
Helper / service que precisa de param sem receber $requestEstática
Ler param dentro de transform de coluna / badge / callbackEstática

API de instância (recomendada no controller)

Injete MadRequest no type-hint do mount() ou de qualquer action pública — o framework resolve via reflection (MadComponent::_resolveAndCall()), sem precisar de container DI nem binding.

use Mad\Http\MadRequest;

public function mount(MadRequest $request): void
{
    $this->form         = new MadForm('form');
    $this->negociacaoId = $request->int('negociacao_id');
    $this->parentId     = $request->int('parent_id');
    $nome               = $request->string('nome', 'Sem nome');

    if ($request->has('mode')) {
        $this->mode = $request->string('mode');
    }
}

Métodos de instância

MétodoDescrição
$r->int($key, $default = 0)Valor como int
$r->string($key, $default = '')Valor como string
$r->float($key, $default = 0.0)Valor como float
$r->bool($key, $default = false)Valor como bool ('1', 'true', 'on', 'yes')
$r->get($key, $default = null)Valor cru
$r->has($key)Existe e não está vazio
$r->exists($key)Existe (mesmo vazio/null)
$r->all()Array completo
$r->only(['a','b'])Subconjunto
$r->except(['x'])Tudo exceto essas keys
$r->nome_campoMagic getter (__get) — retorna valor cru

API estática (acesso global)

Qualquer lugar — Blade, transform de coluna, helper, service. Não precisa receber nada injetado.

use Mad\Http\MadRequest;

$id     = MadRequest::getInt('negociacao_id');
$nome   = MadRequest::getString('nome', 'default');
$ativo  = MadRequest::getBool('ativo');
$existe = MadRequest::hasParam('id');

Métodos estáticos

MétodoDescrição
MadRequest::getInt($key, $default = 0)Valor como int
MadRequest::getString($key, $default = '')Valor como string
MadRequest::getFloat($key, $default = 0.0)Valor como float
MadRequest::getBool($key, $default = false)Valor como bool
MadRequest::param($key, $default = null)Valor cru (sem conversão)
MadRequest::hasParam($key)Existe e não está vazio
MadRequest::allParams()Tudo disponível (props públicas do componente atual + $_REQUEST capturado, merged)
MadRequest::capture($arr)Sobrescreve o cache capturado (testes / boot custom)
MadRequest::reset()Limpa o cache capturado (testes)
Os métodos estáticos têm prefixo get

PHP não permite método estático e de instância com o mesmo nome na mesma classe. Como int()/string()/float()/bool() já existem como métodos de instância, as versões estáticas usam getInt()/getString()/getFloat()/getBool() — não MadRequest::int().

Uso em Blade

@php
    use Mad\Http\MadRequest;
    $negociacaoId = MadRequest::getInt('negociacao_id');
@endphp

<h1>Negociação #{{ $negociacaoId }}</h1>

<!-- Inline -->
@if(\Mad\Http\MadRequest::hasParam('novo'))
    <mad-badge variant="success">Novo</mad-badge>
@endif

Uso em transform de coluna

public static function transformValor(mixed $value, object $row): string
{
    $moeda = \Mad\Http\MadRequest::getString('moeda', 'R$');
    return $moeda . ' ' . number_format((float) $value, 2, ',', '.');
}

Ordem de lookup do static API

Quando você chama MadRequest::getInt('x'), a classe procura em duas fontes nesta ordem:

  1. Prop pública do MadComponent ativo (via MadRenderContext::getComponent()). Usado automaticamente durante render/action do componente — sobrevive ao ciclo reativo (MadWire) desde que o mount() tenha promovido o param a uma prop pública. Só usa o valor se ele for "truthy" (não null, não '', não 0/'0') — senão cai no passo 2, porque pode ser apenas o default da prop, nunca promovido de fato em mount().
  2. $_REQUEST capturado (lazy, na primeira chamada). Funciona no primeiro GET/POST e também captura params de navegação (<mad-btn navigate="X" params="{id:42}">).

Por quê essa ordem? No ciclo reativo (MadWire), a partir da 2ª request o $_REQUEST contém mad_state/mad_action/mad_model — não os params originais da navegação. Props públicas sobrevivem porque entram no state serializado. O lookup em prop primeiro garante que, se você promoveu o param a prop pública em mount(), o accessor estático continua retornando o valor correto em qualquer action posterior.

Padrão recomendado — híbrido

Use as duas APIs em conjunto: instância no mount() para promover o param a prop, estática em qualquer outro lugar que precise do mesmo valor.

class NegociacaoForm extends MadComponent
{
    public int $negociacaoId = 0; // ← prop pública = sobrevive ao wire

    public function mount(MadRequest $request): void
    {
        // Promove o param a prop pública no mount()
        $this->negociacaoId = $request->int('negociacao_id');
    }

    public function onSave(): MadResponse
    {
        // Na action (wire), $_REQUEST não tem mais 'negociacao_id',
        // mas $this->negociacaoId ainda existe (veio do state serializado).
        // MadRequest::getInt('negociacao_id') também funciona — lê da prop.
        $id = MadRequest::getInt('negociacao_id');
        // ...
    }
}

Casos concretos

Param de navegação entre páginas

<mad-btn navigate="NegociacaoForm" method="onEdit" params="{id: 42}">Editar</mad-btn>
// Destino (NegociacaoForm.php)
public int $registroId = 0;

public function onEdit(int $id): void  // ← captura direto do params de navegação
{
    $this->registroId = $id;
    // ...
}

Filtro de listagem via GET

public string $categoria = '';

public function mount(MadRequest $request): void
{
    $this->categoria = $request->string('categoria');
    $this->loadData();
}

Helper externo que precisa do param

class RelatorioHelper
{
    public static function obterAno(): int
    {
        return \Mad\Http\MadRequest::getInt('ano', (int) date('Y'));
    }
}

NUNCA fazer

// ERRADO: ler $_GET/$_POST direto — ignora state do wire
$id = $_GET['id'] ?? 0;

// CERTO
$id = MadRequest::getInt('id');
// ERRADO: esquecer de promover a prop — param vai sumir no wire
public function mount(MadRequest $request): void {
    $id = $request->int('negociacao_id'); // variável local — some após mount()
    $this->loadData($id);
}

// CERTO: promove a prop pública
public int $negociacaoId = 0;
public function mount(MadRequest $request): void {
    $this->negociacaoId = $request->int('negociacao_id');
    $this->loadData();
}
// ERRADO: static int() — colide com método de instância, não existe
MadRequest::int('id');

// CERTO: estático sempre tem o prefixo "get"
MadRequest::getInt('id');
MadRequest::getString('nome');
MadRequest::getFloat('valor');
MadRequest::getBool('ativo');
// ERRADO: usar estático para ler valor "atual" que só deve vir do form
$nome = MadRequest::getString('nome'); // pode pegar GET antigo em vez do input atual

// CERTO: dados de input de form são lidos via $this->form->getData()
$data = $this->form->getData();
$nome = $data->nome ?? '';

Resumo de decisão

Preciso...Usar
Ler param no mount()mount(MadRequest $req) + $req->int()
Param sobreviver ao ciclo reativo (wire)Promover a prop pública em mount()
Ler param no Blade sem prop\Mad\Http\MadRequest::getInt(...)
Ler param em transform/callback/helperEstática MadRequest::getInt(...)
Ler valor de input de formulário$this->form->getData()->campo (não MadRequest)
Teste unitário injetar dados fakeMadRequest::capture([...]) + MadRequest::reset() depois

Próximos