ShellRenderHandler
Renderiza la superficie de Milpa Admin para una request ya autenticada y autorizada: el shell REAL de `milpa/live-web` (Tarea 5) con el form REAL de settings inyectado en `dashboard-main` (Tarea 6) — un `<form method=post action=/milpa/admin/settings>` sin JS (ADR#6: submit nativo, hidden CSRF, botón real), y el sidebar `brand` reflejando el `siteName` guardado en vez del literal `'Milpa Admin'` fijo de la Tarea 5. El hidden `csrf` del form y la cookie `Set-Cookie` que este handler emite comparten SIEMPRE el mismo valor — nunca derivado de `milpa_session` — y el nombre/campo (`milpa_admin_csrf`/`csrf`) es el par exacto que `Milpa\Auth\Http\CsrfGuard('milpa_admin_csrf', 'csrf')` de la Tarea 7 verifica. `dashboard-topbar` SÍ se compone ahora: su botón de toggle (`mui-topbar__nav-toggle`, `@click="navOpen = !navOpen"`) queda respaldado por el runtime Alpine (P5.3b) y se REVELA solo cuando el JS está vivo (`html.milpa-js`, ver AdminPage) — sin JS el sidebar queda visible y el toggle no aparece, así que no hay control muerto (ADR#5). El contenido del topbar (title) es server-truth y se ve siempre (ADR#8).
ShellRenderHandler::__construct()
public function __construct(Milpa\Live\Schema\FormDefinition $definition, array $values, string $csrf, bool $secure, Milpa\Live\Schema\ValidationResult $validation = new ValidationResult(), ?Milpa\Admin\Projection\FormBanner $banner = null, array $sections = [], string $activeSectionId = 'settings', ?string $brand = null):Parameters
| Name | Type | Description |
|---|---|---|
| $definition | Milpa\Live\Schema\FormDefinition | |
| $values | array<string, mixed> | los valores a mostrar en el form — los actuales de configuración en el GET ({@see \Milpa\Admin\Settings\SettingsStateProvider::state()}), o los de la SUMISIÓN cuando este handler se reusa para el redisplay inválido del POST de settings (Tarea 7) — nunca una mezcla de ambos |
| $csrf | string | |
| $secure | bool | el flag `Secure` de la cookie CSRF, YA resuelto por el controller vía `Request::isSecure()` de Symfony (consciente de proxies de confianza); este handler no lo re-deriva de los headers PSR-7 crudos, que un cliente cualquiera podría falsificar con `X-Forwarded-Proto` |
| $validation | ValidationResult | el resultado de validación a mostrar — siempre-ok en el GET (default, ningún error que mostrar todavía), o el `$submission->validation` real del bind cuando el POST de settings (Tarea 7) reusa este handler para el redisplay inválido (server-truth: los errores vienen SIEMPRE de la sumisión, nunca inventados aquí) |
| $banner | ?FormBanner | el aviso form-level (P5.4) a pintar ANTES del `<form>` — `null` en el GET normal (default, ningún aviso todavía), o el `FormBanner` real que arma {@see \Milpa\Admin\Projection\ToolProjector}'s resultado de redisplay cuando una acción de tool falla (Tarea 6) — server-rendered (ADR#8), sin depender de JS para mostrarse |
| $sections | list<AdminSection> | las secciones descubiertas (ADR#12), YA ordenadas por {@see \Milpa\Admin\Section\AdminSectionDiscovery::sections()} — este handler NUNCA re-ordena. `[]` (default) cae al único item hardcoded pre-Tarea-5 (BC de construcción para cualquier caller que aún no las pase) |
| $activeSectionId | string | el id de la sección dueña de esta página, declarado por el controller — matchea por key estricto contra `$sections` (el componente emite `aria-current="page"` cuando coincide) |
| $brand | ?string | el nombre a pintar en el chrome (topbar title + sidebar brand) — SIEMPRE el `siteName` PERSISTIDO ({@see \Milpa\Admin\Settings\SettingsStateProvider::state()}), nunca el de la sumisión: un redisplay inválido manda `siteName=''` en `$values`, y derivar el brand de ahí blanquearía el chrome en cada rechazo. `null` (default) cae al `$values['siteName']` — correcto en el GET, donde `$values` YA es el persistido, y BC para callers que no lo pasen |
ShellRenderHandler::handle()
public function handle(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterfacePinta el shell del admin y emite la cookie CSRF que el POST verificará.
Parameters
| Name | Type | Description |
|---|---|---|
| $request | Psr\Http\Message\ServerRequestInterface |