59 lines
1.9 KiB
PHP
59 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace Modules\Roles\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Spatie\Permission\Models\Permission;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
final class RoleController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
return view('roles::index', ['roles' => Role::withCount(['users', 'permissions'])->orderBy('name')->get()]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
return view('roles::form', ['role' => new Role(['guard_name' => 'web']), 'permissions' => Permission::orderBy('name')->get()]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$data = $this->validated($request);
|
|
$role = Role::create(['name' => $data['name'], 'guard_name' => 'web']);
|
|
$role->syncPermissions($data['permissions'] ?? []);
|
|
|
|
return redirect()->route('administration.roles.index')->with('status', 'Role created.');
|
|
}
|
|
|
|
public function edit(Role $role)
|
|
{
|
|
return view('roles::form', ['role' => $role->load('permissions'), 'permissions' => Permission::orderBy('name')->get()]);
|
|
}
|
|
|
|
public function update(Request $request, Role $role)
|
|
{
|
|
$data = $this->validated($request, $role);
|
|
$role->update(['name' => $data['name']]);
|
|
$role->syncPermissions($data['permissions'] ?? []);
|
|
|
|
return redirect()->route('administration.roles.index')->with('status', 'Role updated.');
|
|
}
|
|
|
|
public function destroy(Role $role)
|
|
{
|
|
abort_if($role->name === 'admin', 422, 'The administrator role cannot be deleted.');
|
|
$role->delete();
|
|
|
|
return back()->with('status', 'Role deleted.');
|
|
}
|
|
|
|
private function validated(Request $request, ?Role $role = null): array
|
|
{
|
|
return $request->validate(['name' => ['required', 'string', 'max:100', Rule::unique('roles', 'name')->ignore($role)], 'permissions' => ['array'], 'permissions.*' => ['string', 'exists:permissions,name']]);
|
|
}
|
|
}
|