127 lines
3.5 KiB
PHP
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');
|
|
}
|
|
}
|