Personalizar Shinobi

Configuración de roles con el paquete Shinobi

Continuando la entrada configuración de Shinobi se procede a crear los controladores y las vistas del sistema de roles para poder gestionar desde el proyecto la asignación de permisos a los usuarios.

CONTROLADORES

A continuación se muestra el controlador de usuarios y de roles. Interesante destacar el método constructor de los dos controladores, que contienen una lista de middleware que se encuentran comentados y que supone otra forma de añadir los middleware en lugar de añadirlos al final de cada ruta en el archivo de rutas como se explica en la entrada anterior.

Controlador de usuarios

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  5. use App\User;
  6. use Caffeinated\Shinobi\Models\Role;
  7. class UserController extends Controller
  8. {
  9. public function __construct(){
  10. //los middleware se pueden implementar en el archivo de rutas
  11. //o aquí en el constructor
  12. /*
  13. $this->middleware("permission:users.create")->only(["create","store"]);
  14. //$this->middleware("permission:users.index")->only("index");
  15. $this->middleware("permission:users.edit")->only("edit","update");
  16. $this->middleware("permission:users.show")->only("show");
  17. $this->middleware("permission:users.destroy")->only("destroy");
  18. */
  19. }
  20. public function index(Request $request)
  21. {
  22. $users=User::paginate();
  23. return view("users.index", compact("users"));
  24. }
  25. public function show(User $user)
  26. {
  27. return view ("users.show", compact("user"));
  28. }
  29. public function edit(User $user)
  30. {
  31. $roles=Role::get()->all();
  32. return view("users.edit",compact("user","roles"));
  33. }
  34. public function update(Request $request, User $user)
  35. {
  36. //actualizar usuario
  37. $user->update($request->all());
  38. //actualizar roles
  39. $user->roles()->sync($request->get("roles"));
  40. return redirect()->route("users.edit",$user->id)
  41. ->with("info","Usuario actualizado con éxito");
  42. }
  43. public function destroy(User $user)
  44. {
  45. $user->delete();
  46. return back()->with("info", "Eliminado correctamente");
  47. }
  48. }

Controlador de roles

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Caffeinated\Shinobi\Models\Permission;
  5. use Caffeinated\Shinobi\Models\Role;
  6. class RoleController extends Controller
  7. {
  8. public function __construct(){
  9. //los middleware se pueden implementar en el archivo de rutas
  10. //o aquí en el constructor
  11. /*
  12. $this->middleware("permission:roles.create")->only(["create","store"]);
  13. $this->middleware("permission:roles.index")->only("index");
  14. $this->middleware("permission:roles.edit")->only("edit","update");
  15. $this->middleware("permission:roles.show")->only("show");
  16. $this->middleware("permission:roles.destroy")->only("destroy");
  17. */
  18. }
  19. public function index()
  20. {
  21. $roles=Role::paginate();
  22. return view("roles.index",compact("roles"));
  23. }
  24. public function create()
  25. {
  26. $permissions=Permission::get();
  27. return view("roles.create", compact("permissions"));
  28. }
  29. public function store(Request $request)
  30. {
  31. $role=Role::create($request->all());
  32. $role->permissions()->sync($request->get("permissions"));
  33. return redirect()->route("roles.edit", $role->id)
  34. ->with("info", "Role guardado con éxito");
  35. }
  36. public function show(Role $role)
  37. {
  38. return view("roles.show",compact("role"));
  39. }
  40. public function edit(Role $role)
  41. {
  42. $permissions=Permission::get();
  43. return view("roles.edit", compact("role", "permissions"));
  44. }
  45. public function update(Request $request, Role $role)
  46. {
  47. $role->update($request->all());
  48. $role->permissions()->sync($request->get("permissions"));
  49. return redirect()->route("roles.edit", $role->id)
  50. ->with("info", "Role actualizado con éxito");
  51. }
  52. public function destroy($id)
  53. {
  54. $role=Role::find($id)->delete();
  55. return back()->with("info", "El registro se ha eliminado correctamente");
  56. }
  57. }

VISTAS

Las vistas muestran el listado de usuarios y el listado de roles respectivamente mediante una tabla. Las llaves junto a los signos de admiración pertenecen a un formulario de tipo LaravelCollective que se ha añadido en el campo de eliminar de las dos vistas. 

Vista de usuarios (index)

  1. @extends("layout/layout_blog")
  2. @section("content")
  3. <div class="container ">
  4. <div class="row ">
  5. <div class="col-md-8 mt-3 flex-first ">
  6. <div class="panel panel-default">
  7. <div class="panel-heading text-center" >
  8. Usuarios
  9. </div>
  10. <div class="panel-body">
  11. <table class="table table-striped table-hover">
  12. <thead>
  13. <tr>
  14. <th width="10px">ID</th>
  15. <th>Nombre</th>
  16. <th colspan="3"> </th>
  17. </tr>
  18. </thead>
  19. <tbody>
  20. @foreach($users as $user)
  21. <tr>
  22. <td>{{ $user->id }}</td>
  23. <td>{{ $user->name }}</td>
  24. <td width="10px">
  25. @can("users.show")
  26. <a href="{{ route("users.show", $user->id) }}"
  27. class="btn btn-sm btn-default">
  28. Ver
  29. </a>
  30. @endcan
  31. </td>
  32. <td width="10px">
  33. @can("users.edit")
  34. <a href="{{ route("users.edit", $user->id) }}"
  35. class="btn btn-sm btn-default">
  36. Editar
  37. </a>
  38. @endcan
  39. </td>
  40. <td width="10px">
  41. @can("users.destroy")
  42. <!-- necesario Laravel/Collective -->
  43. {!! Form::open(["route" => ["users.destroy", $user->id],
  44. "method" => "DELETE"]) !!}
  45. <button class="btn btn-sm btn-danger">
  46. Eliminar
  47. </button>
  48. {!! Form::close() !!}
  49. @endcan
  50. </td>
  51. </tr>
  52. @endforeach
  53. </tbody>
  54. </table>
  55. {{ $users->render() }}
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. @endsection

Vista de roles (index)

  1. @extends("layout/layout_blog")
  2. @section("content")
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2 mt-3 ">
  6. <div class="panel panel-default">
  7. <div class="panel-heading" >
  8. Roles
  9. @can("roles.create")
  10. <a href="{{ route("roles.create") }}"
  11. class="btn btn-sm btn-primary floatR">
  12. Crear
  13. </a>
  14. @endcan
  15. </div>
  16. <div class="panel-body">
  17. <table class="table table-striped table-hover">
  18. <thead>
  19. <tr>
  20. <th width="10px">ID</th>
  21. <th>Nombre</th>
  22. <th colspan="3"> </th>
  23. </tr>
  24. </thead>
  25. <tbody>
  26. @foreach($roles as $role)
  27. <tr>
  28. <td>{{ $role->id }}</td>
  29. <td>{{ $role->name }}</td>
  30. <td width="10px">
  31. @can("roles.index")
  32. <a href="{{ route("roles.show", $role->id) }}"
  33. class="btn btn-sm btn-default">
  34. Ver
  35. </a>
  36. @endcan
  37. </td>
  38. <td width="10px">
  39. @can("roles.edit")
  40. <a href="{{ route("roles.edit", $role->id) }}"
  41. class="btn btn-sm btn-default">
  42. Editar
  43. </a>
  44. @endcan
  45. </td>
  46. <td width="10px">
  47. @can("roles.destroy")
  48. {!! Form::open(["route" => ["roles.destroy", $role->id],
  49. "method" => "DELETE"]) !!}
  50. <button class="btn btn-sm btn-danger">
  51. Eliminar
  52. </button>
  53. {!! Form::close() !!}
  54. @endcan
  55. </td>
  56. </tr>
  57. @endforeach
  58. </tbody>
  59. </table>
  60. {{ $roles->render() }}
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. </div>
  66. @endsection

Solo queda añadir las vistas del detalle (show), el formulario de creación (create) y el formulario de edición (edit).

Vista detalle de usuarios (show)

  1. @extends("layout/layout_blog")
  2. @section("content")
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2 mt-3 ">
  6. <div class="panel panel-default">
  7. <div class="panel-heading text-center" >
  8. Usuarios
  9. </div>
  10. <div class="panel-body">
  11. <p><strong>Nombre</strong> {{ $user->name }}</p>
  12. <p><strong>Email</strong> {{ $user->email }}</p>
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. @endsection

Vista detalle de roles (show)

  1. @extends("layout/layout_blog")
  2. @section("content")
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2 mt-3 ">
  6. <div class="panel panel-default">
  7. <div class="panel-heading text-center" >
  8. Roles
  9. </div>
  10. <div class="panel-body">
  11. <p><strong>Nombre</strong> {{ $role->name }}</p>
  12. <p><strong>Slug</strong> {{ $role->slug }}</p>
  13. <p><strong>Descripción</strong> {{ $role->description }}</p>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. </div>
  19. @endsection

El formulario de creación y edición se puede optimizar con LaravelCollective haciendo uso de un único formulario y añadiéndolo con un include.  Para el caso de usuarios solo es necesaria la edición ya que el módulo auth ya contiene un formulario definido para la creación de usuarios. Sin embargo se realiza el mismo mecanismo que en roles para mantener la misma estructura de código.

Vista de formulario usuarios (form)

  1. <div class="form-group">
  2. {{ Form::label("name","Nombre") }}
  3. {{ Form::text("name",null,["class" => "form-control"]) }}
  4. </div>
  5. <hr>
  6. <h3>Lista de roles</h3>
  7. <div class="form-group">
  8. <ul class="list-unstyled">
  9. @foreach($roles as $role)
  10. <li>
  11. <label>
  12. {{ Form::checkbox("roles[]",$role->id,null) }}
  13. {{ $role->name }}
  14. <em>({{ $role->description ?: "N/A" }})</em>
  15. </label>
  16. </li>
  17. @endforeach
  18. </ul>
  19. </div>
  20. <div class="form-group">
  21. {{ Form::submit("Guardar",["class" => "btn btn-sm btn-primary"]) }}
  22. </div>

Vista de formulario roles (form)

  1. <div class="form-group">
  2. {{ Form::label("name","Nombre") }}
  3. {{ Form::text("name",null,["class" => "form-control"]) }}
  4. </div>
  5. <div class="form-group">
  6. {{ Form::label("slug","URL Amigable") }}
  7. {{ Form::text("slug",null,["class" => "form-control"]) }}
  8. </div>
  9. <div class="form-group">
  10. {{ Form::label("description","Descripción") }}
  11. {{ Form::text("description",null,["class" => "form-control"]) }}
  12. </div>
  13. <hr>
  14. <h3>Permiso especial</h3>
  15. <div class="form-group">
  16. <label>{{ Form::radio("special", "all-access") }} Acceso Total</label>
  17. <label>{{ Form::radio("special", "no-access") }} Ningún acceso</label>
  18. </div>
  19. <h3>Lista de roles</h3>
  20. <div class="form-group">
  21. <ul class="list-unstyled">
  22. @foreach($permissions as $permission)
  23. <li>
  24. <label>
  25. {{ Form::checkbox("permissions[]",$permission->id,null) }}
  26. {{ $permission->name }}
  27. <em>({{ $permission->description ?: "Sin descripción" }})</em>
  28. </label>
  29. </li>
  30. @endforeach
  31. </ul>
  32. </div>
  33. <div class="form-group">
  34. {{ Form::submit("Guardar",["class" => "btn btn-sm btn-primary"]) }}
  35. </div>

A continuación se muestra el código de las vistas de creación y edición que contienen los formularios anteriores añadidos con un include. La vista de edición de usuario es la vista que permite marcar o desmarcar de la lista de roles existentes al usuario editado.

Vista de edición de usuarios (edit)

  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2">
  6. <div class="panel panel-default">
  7. <div class="panel-heading">Producto</div>
  8. <div class="panel-body">
  9. {!! Form::model($user, ["route" => ["users.update",$user->id],
  10. "method" => "PUT" ]) !!}
  11. @include("users.partials.form")
  12. {!! Form::close() !!}
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. @endsection

La vista de creación está compuesta por cajas de texto para introducir el nombre, la url amigable y la descripción, además de toda la lista de permisos existentes que permiten asignar el permiso o los permisos definidos para el nuevo rol.

Vista de creación de roles (create)

  1. @extends('layout/layout_blog')
  2. @section('content')
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2">
  6. <div class="panel panel-default">
  7. <div class="panel-heading">
  8. Role
  9. </div>
  10. <div class="panel-body">
  11. {!! Form::open(["route" => "roles.store"]) !!}
  12. @include("roles.partials.form")
  13. {!! Form::close() !!}
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. </div>
  19. @endsection

La vista de edición es igual que la de creación pero con los datos mostrados

Vista de edición de roles (edit)

  1. @extends('layout/layout_blog')
  2. @section('content')
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-8 col-md-offset-2">
  6. <div class="panel panel-default">
  7. <div class="panel-heading">Role</div>
  8. <div class="panel-body">
  9. {!! Form::model($role, ["route" => ["roles.update",$role->id],
  10. "method" => "PUT" ]) !!}
  11. @include("roles.partials.form")
  12. {!! Form::close() !!}
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. @endsection

Fuente: //www.youtube.com/channel/UCRByhHailXC3HqWL2QrYw7w

Comentarios: 0

Para poder comentar es necesario iniciar sesión



Este dominio utiliza cookies de terceros para crear estadísticas y publicidad personalizada. Si continúa navegando está aceptando su uso