base-laravel/app/Http/Controllers/RoleController.php

159 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Role;
use App\Permission;
use App\User;
class RoleController extends Controller
{
/**
* Enforce middleware
*/
public function __construct(){
$this->middleware(['auth']);
$this->middleware(['permissions:CreateRole'], ['only' => ['create','store']]);
$this->middleware(['permissions:CreateRole.EditRole.DeleteRole'], ['only' => ['index','show']]);
$this->middleware(['permissions:EditRole'], ['only' => ['edit','update']]);
$this->middleware(['permissions:DeleteRole'], ['only' => ['destroy']]);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//Pass all roles
$roles=Role::get();
return view('roles.index')->with('roles', $roles);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$categories=Permission::select('category')->groupBy('category')->get();
foreach ($categories as $value){
$permissions[$value->category]=Permission::where('category',$value->category)->get();
}
return view('roles.create')->with('permissions',$permissions);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//Validate name and description
$this->validate($request, [
'name'=>'required|max:120',
'description'=>'required|max:3000'
]);
$perms = array();
foreach($request->all() as $element => $value){
if(preg_match('/p_.*/', $element)){
array_push($perms, (int)$value);
}
}
$role = Role::create($request->only('name', 'description'));
$role->permissions()->sync($perms);
//Redirect to the roles.index view and display message
return redirect()->route('roles.index')->with('message','Role successfully added.');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//Redirect requests to view specific role to roles index
return redirect('roles');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$role = Role::with('permissions')->findOrFail($id);
$categories=Permission::select('category')->groupBy('category')->get();
foreach ($categories as $value){
$permissions[$value->category]=Permission::where('category',$value->category)->get();
}
$active_perms=array();
$active_cats=array();
foreach($role->permissions as $perm){
array_push($active_perms,$perm->id);
array_push($active_cats,$perm->category);
}
return view('roles.edit')->with('role',$role)->with('permissions',$permissions)->with('active_perms',$active_perms)->with('active_cats',$active_cats);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//Find and update user after validating
$role = Role::findOrFail($id);
$this->validate($request, [
'name'=>'required|max:120',
'description'=>'required|max:3000'
]);
$perms = array();
foreach($request->all() as $element => $value){
if(preg_match('/p_.*/', $element)){
array_push($perms, (int)$value);
}
}
$update = $request->only(['name','description']);
$role->fill($update)->save();
$role->permissions()->sync($perms);
return redirect()->route('roles.index')->with('message','Role successfully edited.');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//Find and remove user
$role = Role::findOrFail($id);
$role->permissions()->sync([]);
$role->users()->sync([]);
$role->delete();
return redirect()->route('roles.index')->with('message','Role successfully deleted.');
}
}