Ir al contenido
Bondry

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():

PHP
$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:

JSON
"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:

PHP
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():

PHP
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:

PHP
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:

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.