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ário | Usar |
|---|---|
mount() de MadComponent recebendo param de navegação | Instância via type-hint |
| Action que precisa ler a query string atual | Instância via type-hint |
| Ler param dentro de Blade | Estática (MadRequest::getInt(...)) |
Helper / service que precisa de param sem receber $request | Estática |
| Ler param dentro de transform de coluna / badge / callback | Está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étodo | Descriçã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_campo | Magic 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étodo | Descriçã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) |
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:
-
Prop pública do
MadComponentativo (viaMadRenderContext::getComponent()). Usado automaticamente durante render/action do componente — sobrevive ao ciclo reativo (MadWire) desde que omount()tenha promovido o param a uma prop pública. Só usa o valor se ele for "truthy" (nãonull, não'', não0/'0') — senão cai no passo 2, porque pode ser apenas o default da prop, nunca promovido de fato emmount(). -
$_REQUESTcapturado (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/helper | Estática MadRequest::getInt(...) |
| Ler valor de input de formulário | $this->form->getData()->campo (não MadRequest) |
| Teste unitário injetar dados fake | MadRequest::capture([...]) + MadRequest::reset() depois |