Rutas, permisos y pantallas de administración
Cómo conectar un módulo al front end, la matriz de grupos y la navegación de administración.
Rutas#
Dos archivos, cargados desde boot():
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
$this->loadRoutesFrom(__DIR__.'/../routes/admin.php');
Nombra cada ruta con tu slug como prefijo (directory.index,
admin.directory.settings). Eso es lo que hace que Route::has() sea una
guarda confiable para otros módulos, y lo que permite que el panel enlace
a tu pantalla de configuración.
Las rutas de administración van detrás del middleware del panel, igual que las del core. Nunca implementes tu propia autenticación de administración.
Permisos#
Decláralos en el manifiesto:
"provides": { "permissions": ["directory.view", "directory.manage"] }
Se registran en la matriz de grupos al instalar y aparecen en Members > Member groups junto a los permisos de cada otro módulo. Chequéalos de la forma habitual:
Gate::allows('directory.manage');
Tres reglas:
- Nunca inventes un sistema de permisos paralelo. La matriz de grupos es la única respuesta a "quién puede hacer esto", y los compradores ya la entienden.
- Chequea siempre en el servidor. Ocultar un botón es presentación, no seguridad.
- Delimita el alcance donde tenga sentido. Un permiso por área de tu módulo es mejor que un único interruptor de todo o nada.
Navegación de administración#
La navegación del panel se construye a partir de un registro, no está
hardcodeada. Contribuyes a través del slot admin.menu en boot():
Hooks::on('admin.menu', fn (HookContext $ctx) => [
'label' => __('directory::admin.title'),
'url' => route('admin.directory.settings'),
'order' => 40,
]);
Agrega solo entradas a las que el administrador actual realmente pueda llegar. Un elemento de menú que lleva a un 403 es ruido.
Slots de interfaz#
El core declara estos, y un módulo puede declarar los suyos propios:
admin.menu, admin.dashboard.widgets, profile.tabs, profile.sidebar,
settings.pages, search.sources, editor.toolbar, member.actions,
head.meta, body.end.
Registrando:
Hooks::on('profile.tabs', fn (HookContext $ctx) => [
'label' => __('directory::labels.items'),
'url' => route('directory.member', $ctx->get('member')),
'order' => 20,
]);
Consumiendo, en una vista Blade:
@hook('profile.tabs', ['member' => $member])
Las contribuciones se recolectan, se ordenan por order y se renderizan.
Búsqueda#
Contribuye a la búsqueda del sitio a través de search.sources. Tu
fuente es responsable de aplicar tus propias reglas de visibilidad: un
resultado nunca debe aparecer para alguien que no podría abrir la página
a la que apunta.
Pantallas#
Las pantallas de administración usan los componentes del panel para que tu módulo se vea como el producto y no como un plugin. En particular:
- botones-ícono cuadrados de tamaño uniforme, con un dropdown de chevron para las acciones secundarias, en cada lista;
- el modal del producto para confirmaciones, nunca
window.confirm; - selects con el chevron personalizado, nunca el nativo sin estilizar;
- cero violaciones de axe en cada pantalla que agregues, en modo claro y oscuro.