taller/app/Http/Controllers/RolController.php
2026-10-15 08:51:58 -03:00

127 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Rol;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\PermissionRegistrar;
class RolController extends Controller
{
public function index()
{
$roles = Rol::with(['permissions', 'usuarios'])->get();
return view('roles.index', compact('roles'));
}
public function create()
{
$permisos = Permission::where('guard_name', 'web')->get();
$usuarios = User::all();
return view('roles.create', compact('permisos', 'usuarios'));
}
public function store(Request $request)
{
$datos = $request->validate([
'name' => 'required|string|max:100|unique:roles,name',
'permisos' => 'nullable|array',
'permisos.*' => 'exists:permissions,id',
'usuarios' => 'nullable|array',
'usuarios.*' => 'exists:users,id',
]);
$rol = new Rol();
$rol->name = $datos['name'];
$rol->guard_name = 'web';
$rol->save();
// Relación muchos a muchos: Rol - Permisos
$rol->permissions()->sync($request->input('permisos', []));
// Relación muchos a muchos: Rol - Usuarios
$rol->usuarios()->sync($request->input('usuarios', []));
// Limpiar caché de permisos de Spatie
app(PermissionRegistrar::class)->forgetCachedPermissions();
return redirect()->route('roles.index')
->with('mensaje-success', 'Rol creado correctamente');
}
public function show($id)
{
$rol = Rol::with(['permissions', 'usuarios'])->findOrFail($id);
return view('roles.show', compact('rol'));
}
public function edit($id)
{
$rol = Rol::with(['permissions', 'usuarios'])->findOrFail($id);
$permisos = Permission::where('guard_name', 'web')->get();
$usuarios = User::all();
$permisosSeleccionados = $rol->permissions->pluck('id')->toArray();
$usuariosSeleccionados = $rol->usuarios->pluck('id')->toArray();
return view('roles.edit', compact(
'rol',
'permisos',
'usuarios',
'permisosSeleccionados',
'usuariosSeleccionados'
));
}
public function update(Request $request, $id)
{
$rol = Rol::findOrFail($id);
$datos = $request->validate([
'name' => [
'required',
'string',
'max:100',
Rule::unique('roles', 'name')->ignore($rol->id),
],
'permisos' => 'nullable|array',
'permisos.*' => 'exists:permissions,id',
'usuarios' => 'nullable|array',
'usuarios.*' => 'exists:users,id',
]);
$rol->name = $datos['name'];
$rol->save();
// Actualizar permisos del rol
$rol->permissions()->sync($request->input('permisos', []));
// Actualizar usuarios del rol
$rol->usuarios()->sync($request->input('usuarios', []));
// Limpiar caché de permisos de Spatie
app(PermissionRegistrar::class)->forgetCachedPermissions();
return redirect()->route('roles.index')
->with('mensaje-success', 'Rol actualizado correctamente');
}
public function destroy($id)
{
$rol = Rol::findOrFail($id);
$rol->delete();
return redirect()->route('roles.index')
->with('mensaje-success', 'Rol eliminado correctamente');
}
}