MadBlade
Fachada de render Blade (Illuminate) — view, render, renderString, diretivas mad-*.
Mad\View\MadBlade é a fachada estática que envolve o motor de templates do
MAD — renderiza arquivos .blade.php, strings inline e componentes reativos
(MadComponent), e expõe um pipeline de compilação próprio
(MadBladeCompiler) que entende as tags <mad-*> do framework
além do Blade padrão.
MadBlade hoje compila sobre o Illuminate\View\Compilers\BladeCompiler
nativo do Laravel — o motor BladeOne (eftec/bladeone) usado nas fases anteriores do
framework foi substituído. @props e
<x-slot name="..."> (named slots) funcionam normalmente
hoje — se você leu em outro lugar que BladeOne não suportava, essa
limitação não existe mais nesta versão.
Renderizar templates
Dentro de um MadComponent você raramente chama MadBlade
diretamente — basta retornar o nome da view em view() e o framework cuida do
resto. Use a fachada quando precisa de HTML renderizado fora desse ciclo:
dentro de uma op MadResponse->html(), num e-mail, num PDF, etc.
use Mad\View\MadBlade;
// Renderiza para string — uso típico dentro de MadResponse::html()
$html = MadBlade::render('parciais.lista-produtos', ['produtos' => $produtos]);
return (new MadResponse())->html('#lista-container', $html);
// Renderiza e retorna um elemento "pronto pra add()" — usado em integrações
// com código que ainda monta a página por fora de um MadComponent
$el = MadBlade::view('admin.relatorio-customizado', ['titulo' => 'Relatório']);
$el->show(); // echo do HTML
// Template inline (string), sem precisar de um arquivo .blade.php
$html = MadBlade::renderString('Olá, {{ $nome }}!', ['nome' => 'Maria']);
| Método | Retorno | Quando usar |
|---|---|---|
render($view, $data = []) | string | HTML pronto — uso mais comum (ex.: dentro de MadResponse->html()). |
view($view, $data = []) | MadRendered | Wrapper com show()/__toString() — para APIs que esperam um objeto "exibível". |
renderString($template, $data = []) | string | Template Blade inline (sem arquivo) — cacheado por hash do conteúdo. |
viewString($template, $data = []) | MadRendered | Mesma ideia de view(), mas para template inline. |
component($class, $params = []) | MadRendered | Instancia + mount() + render de um MadComponent já envelopado no wrapper. |
configure(['views' => ..., 'cache' => ...]) | void | Sobrescreve os paths antes do primeiro uso (a chave mode, legado do BladeOne, é aceita e ignorada). |
share($key, $value) | void | Variável global em toda view renderizada por MadBlade. |
directive($name, callable $handler) | void | Registra diretiva custom no compilador. |
Views ficam em resources/views/ (raiz do app) e são referenciadas por
dot-notation, exatamente como qualquer view Laravel — ex.:
'public.docs-fw.pages.services.madblade' resolve para
resources/views/public/docs-fw/pages/services/madblade.blade.php. Templates do
próprio pacote do framework (componentes mad-*) ficam num segundo diretório de
busca interno, consultado depois dos templates do app — o que permite sobrescrever qualquer
componente mad-* criando um arquivo de mesmo nome no app.
Renderizar um MadComponent diretamente
component($class, $params = []) instancia um MadComponent,
roda mount($params) e devolve um MadRendered com o HTML já
envelopado pelo wrapper (modal/drawer/internal) — imprima com show() ou
interpole com {!! ... !!} (via __toString()). Útil para embutir um componente reativo dentro de uma view comum:
use Mad\View\MadBlade;
// Instancia, monta e renderiza um MadComponent fora do ciclo normal de rota —
// útil para embutir um componente reativo dentro de uma view comum.
return MadBlade::component(ContadorComponent::class, ['inicial' => 10]);
MAD__BLADE_COMMENT__1__
{!! \Mad\View\MadBlade::component(\App\Components\ContadorComponent::class) !!}
@props e named slots
Componentes Blade próprios do app podem declarar props com default via
@props([...]) — equivalente a definir
$var = $var ?? default; dentro de um bloco @php para cada chave,
sem sobrescrever valores já vindos do componente pai:
MAD__BLADE_COMMENT__2__
@props(['title' => '', 'size' => 'md', 'required' => false])
<div class="meu-card meu-card-{{ $size }}">
<strong>{{ $title }}</strong>
@if($required) <span class="mad-required">*</span> @endif
</div>
Slots nomeados via <x-slot name="..."> também são suportados dentro de
qualquer tag <mad-*>/<x-*> com corpo — o compilador
extrai cada x-slot e os entrega como slots clássicos do
Illuminate\View\Factory. O atalho <menu>...</menu>
também é aceito como sinônimo de <x-slot name="menu"> (usado por
mad-dropdown e similares):
MAD__BLADE_COMMENT__3__
<mad-modal name="m" title="Confirmar">
<x-slot name="footer">
<mad-btn mad:click="onConfirmar" variant="primary">Confirmar</mad-btn>
</x-slot>
Tem certeza que deseja continuar?
</mad-modal>
MAD__BLADE_COMMENT__4__
<mad-dropdown label="Ações">
<menu>
<mad-dropdown-item mad:click="onEditar">Editar</mad-dropdown-item>
</menu>
</mad-dropdown>
Diretivas built-in
O boot do MadBlade registra um conjunto de diretivas auxiliares — todas chamam
métodos estáticos _icon()/_field()/_section()/etc.
da própria classe, que produzem HTML pronto sem precisar de um componente Blade separado:
@madIcon('check-circle')
@madIcon('check-circle', 'mad-text-success', '20px')
@madField('Nome', $inputHtml)
@madField('Nome', $inputHtml, true, 'Como aparece nos documentos')
@madSection('Dados gerais', 'Informações básicas do cadastro', 'info')
@madAlert('Operação concluída com sucesso.', 'success', 'Tudo certo')
@madBadge('Ativo', 'success')
@madBtn('Salvar', 'primary', 'save', 'type="submit"')
@madSeparator('Endereço')
@madCard($conteudoHtml, 'mad-card-compact')
@css('app/lib/include/builder/ui/meu-componente.css')
@css('app/lib/include/builder/ui/meu-componente.css', true) MAD__BLADE_COMMENT__5__
@madBind('contador') MAD__BLADE_COMMENT__6__
@js($arrayPhp) MAD__BLADE_COMMENT__7__
@canAccess('ProdutoForm')
<mad-btn navigate="ProdutoForm">Novo produto</mad-btn>
@endCanAccess
| Diretiva | Gera |
|---|---|
@props([...]) | Defaults de props sem sobrescrever valores já definidos. |
@madIcon($nome, $class?, $size?) | Ícone Lucide (<i data-lucide="...">). |
@madField($label, $html, $required?, $hint?) | Wrapper de campo com label e hint. |
@madSection($title, $desc?, $icon?) | Cabeçalho de seção. |
@madAlert($msg, $type?, $title?, $icon?) | Caixa de alerta inline (info|success|warning|error). |
@madBadge($texto, $variant?) | Badge/pill. |
@madBtn($label, $variant?, $icon?, $attrs?, $size?) | Botão HTML cru (fora do ciclo de um mad-btn reativo). |
@madSeparator($label?) | Linha divisória, com ou sem label. |
@madCard($conteudo, $class?) | Wrapper de card. |
@css($path, $scope?) | Embute um arquivo CSS inline — $scope = true isola seletores por hash (estilo Vue scoped). |
@madAction(...) / @madGet(...) / @madUrl(...) | Atalhos para MadAction — ver MadAction. |
@madBind($prop) | <span data-mad-bind="prop"> — alvo de update parcial via MadResponse->bind(). |
@madWire([...]) | Emite mad-data='{...}' com o state inicial das props públicas listadas. |
@js($valor) | Serializa PHP para JSON seguro dentro de um atributo HTML (equivalente ao @js do Laravel). |
@canAccess('Classe', 'método'?) / @endCanAccess | Renderiza o bloco só se o usuário tem permissão (via PermissionGate). |
Diretivas mad:* → data-mad-*
Depois que o compilador nativo termina, um pós-passe converte os atributos
mad:click, mad:model, mad:model.live,
mad:submit, mad:change, mad:loading e
mad:loading.remove para seus equivalentes data-mad-* (HTML5
válido, lido pelo MadWire no client). Blocos <pre>/<code>
ficam protegidos dessa conversão, então documentação que apenas cita
mad:click dentro de um exemplo não vira atributo de verdade. Ver
Diretivas mad-*.
Registrar diretivas e compartilhar dados
use Mad\View\MadBlade;
// Registrado uma vez no boot do app (ex.: AppServiceProvider). O handler
// recebe a expressão entre parênteses como string crua e deve devolver PHP
// pronto para ser injetado no template — incluindo as tags de abertura e
// fechamento, igual a qualquer diretiva nativa do Laravel.
MadBlade::directive('meuHelper', function (string $exp): string {
$openTag = '<' . '?php';
return "{$openTag} echo minhaFuncao({$exp}); ?>";
});
use Mad\View\MadBlade;
// Disponível em TODA view renderizada por MadBlade a partir daqui
MadBlade::share('appName', 'Minha ERP');
Cache e configuração de paths
O cache compilado vive em storage/framework/mad-blade/ por padrão (criado
automaticamente). configure(['views' => ..., 'cache' => ...]) sobrescreve os
paths antes do primeiro uso — útil em testes ou setups multi-app. Não existe um método
clearCache(): para forçar recompilação, apague o diretório de cache
diretamente.
O compilador preserva o conteúdo de comentários Blade intacto antes de converter
<mad-xxx> em <x-xxx> — então um exemplo de uso
dentro de um comentário (como os desta própria página) não vira uma invocação real
nem corre risco de recursão infinita quando o componente cita a si mesmo no próprio
exemplo.