Cargando…

Esto está tardando más de lo esperado.

Volver al centro de ayuda

Construye un CRUD acotado al equipo

La clase base de recurso que mantiene un CRUD de Laravel Front dentro del equipo, y cómo registrar su ruta y sus permisos.

Weblabor Base construye sus pantallas de administración con Laravel Front: una clase de recurso declara los campos y el kit renderiza la lista, los formularios y la página de detalle. Ve El panel de administración en el sitio de la base. Dentro de un equipo la misma herramienta funciona, con una clase base que mantiene cada registro y cada verificación de permisos dentro del equipo. Esta guía la muestra.

La clase base

app/Front/Resources/Team/Resource.php:

namespace App\Front\Resources\Team;

use App\Front\Resources\Resource as Base;

class Resource extends Base
{
    public $guards = ['team'];
    public $layout = 'layouts.teams';

    public function indexQuery($query)
    {
        return $query->where('team_id', team()->id)->latest();
    }

    public function processDataBeforeSaving($data)
    {
        $data['team_id'] = team()->id;
        return $data;
    }
}
Qué define Qué significa
$guards = ['team'] Los permisos retrieve, create, update y delete del recurso se crean en el guard team y se revisan contra los roles del equipo.
$layout = 'layouts.teams' Las pantallas se renderizan dentro del espacio de trabajo del equipo, con su barra lateral.
indexQuery La lista muestra sólo los registros del equipo actual.
processDataBeforeSaving Un registro creado o actualizado desde el formulario pertenece al equipo actual, traiga lo que traiga la petición.

Un recurso que en cambio extiende el App\Front\Resources\Resource de la base está mal de tres maneras a la vez: sus permisos caen en el guard web, así que un miembro con el rol de equipo correcto es rechazado; su lista muestra los registros de todos los equipos; y sus registros se guardan sin team_id.

Escribe uno

  1. La tabla necesita una columna team_id, con índice, que apunte a teams.
  2. Crea la clase bajo app/Front/Resources/Team/:
namespace App\Front\Resources\Team;

use App\Models\Project as Model;
use WeblaborMx\Front\Inputs;

class Project extends Resource
{
    public $base_url = '/team/projects';
    public $model = Model::class;
    public $icon = 'folder';

    public function fields()
    {
        return [
            Inputs\ID::make(),
            Inputs\Text::make('Name')->rules('required'),
            Inputs\Textarea::make('Description')->hideFromIndex(),
        ];
    }
}
  1. Regístrala en routes/web.php, dentro del grupo del espacio de trabajo, para que el middleware team ponga el contexto antes de que corra cualquier verificación:
Route::prefix('team')
    ->middleware(['auth', 'security', 'team', 'ensure.free.subscription', 'ensure.subscribed'])
    ->name('team.')
    ->group(function () {
        Route::front('Team\\Project');
    });

Laravel Front nombra las rutas team.front.projects, team.front.projects.create y así sucesivamente.

  1. Siembra los permisos:
php artisan db:seed --class=PermissionSeeder

Con discover_front_permissions encendido en config/app.php, el seeder encuentra el recurso y crea retrieve projects, create projects, update projects y delete projects en el guard team. El propietario de cada equipo los tiene desde ese momento; cualquier otro miembro los recibe a través de un rol. Ve Roles y permisos del equipo.

  1. Agrega el enlace a la barra lateral del espacio de trabajo, en resources/views/layouts/teams.blade.php, donde están los enlaces de miembros y roles.

La policy

Laravel Front le pregunta a la policy del modelo. Extiende App\Policies\BasePolicy y nombra el permiso:

namespace App\Policies;

class ProjectPolicy extends BasePolicy
{
    public $name = 'projects';
}

BasePolicy revisa el guard correcto según el contexto y rechaza un registro de otro equipo en view, update y delete. Sobrescribe un método sólo para una regla tuya, y llama primero al padre para que las verificaciones de equipo se mantengan.

El que trae el kit

App\Front\Resources\Team\Role, en /team/roles, es el CRUD de roles del equipo y el ejemplo a copiar: extiende la clase base, acota su lista y agrega la acción de clonar. Su ruta se registra de la misma manera, con Route::front('Team\\Role').