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
- La tabla necesita una columna
team_id, con índice, que apunte ateams. - 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(),
];
}
}
- Regístrala en
routes/web.php, dentro del grupo del espacio de trabajo, para que el middlewareteamponga 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.
- 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.
- 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').