Laravel crud controller
Laravel permite de forma fácil y cómoda crear un controlador y todos los métodos o funciones necesarias para implemetar un crud (Create, Update, Delete).
De vista general hay que crear:
- Controlador
- Vistas
- Rutas
- Enlaces de administrador a cada ruta
Crear un crud controller en laravel
Para crear un crud en laravel a través de php artisan make controller crud, hay que añadir al final un guión y la letra -r
php artisan make:controller Carpeta\RoleController -r
Este comando crea un fichero nuevo app\Http\Controllers\Carpeta\RoleController.php
y crea automátiamente los siguientes métos.
- index() para mostrar datos iniciales.
- create() para implementar la inserción de datos
- show($id) para motrar datos.
- edit($id) para editar datos.
- update(Request $request, $id) para actualizar datos
- destroy($id) para borrar datos, según las relaciones entre tablas.
Crud controller con Laravel Permission
En la página de Laravel Permission de Spatie se puede tomar nota de todos los usos de su librería.
En este ejemplo vamos a implementar un ejemplo de CRUD con permisos.
Instalar Laravel Permission de spatie
Para instalar este paquete hay que ejecutar el comando de spatie via composer
composer require spatie/laravel-permission
Después hay que publicar ciertos ficheros y generar migraciones, y el paquete facilita esta tarea hacer con el comando de publicar e indicando el provider
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Esto ha generado los siguientes ficheros en la carpeta pública
Origen: \vendor\spatie\laravel-permission\config\permission.php
Destino: \config\permission.php
Origen: \vendor\spatie\laravel-permission\database\migrations\create_permission_tables.php.stub
Destino: \database\migrations\2022_03_02_211324_create_permission_tables.php
Limpiar la caché de Laravel con el comando config y pasando el parámetro clear
php artisan config:clear
Y finalmente ejecutar las migraciones con el comando
php artisan migrate
Configurar Laravel Permission de spatie
Para comenzar a utilizar roles y permisos, la librería en su documentación recomienda agregar un Trait HasRoles al modelo Users, importándolo y colocándolo dentro de la clase
...
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable, ApiTrait, HasRoles;
...
use Spatie\Permission\Traits\HasRoles;
Una vez realizado esto ya se puede hacer uso de la librería, en el controlador creado anteriormente app\Http\Controllers\Carpeta\RoleController.php
use Spatie\Permission\Models\Role;
Crear un nuevo role y permisos específicos
Para crear un nuevo role y asignarle permisos, es conveniente hacerlo con un Seeder, para que se cree en la base de datos automáticamente.
En este ejemplo vamos a crear un role para permitir editar productos. Entonces utilizar el comando make para crear el seeder
php artisan make:seeder RoleSeeder
Editar el fichero e importar las librerías Role y Permission.
En la función run implementar el rol adminsitrador y los permisos que permitirán ralizar acciones. Una vez declarados se asigna los permisos al rol, a través de dos formas:
- Individual, a través de los siguente métodos:
$role->givePermissionTo($permission);
$permission->assignRole($role);
- Multiple: a traves de los siguentes métodos:
$role->syncPermissions($permissions);
$permission->syncRoles($roles);
Pero también puede ser borrados, a través de los siguientes métodos:
$role->revokePermissionTo($permission);
$permission->removeRole($role);
Así el ejemplo quedaría de la siguiente forma:
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
public function run()
{
$admin = Role::create(['name' => 'admin']);
$create_product = Permission::create(['name' => 'create product']);
$edit_product = Permission::create(['name' => 'edit product']);
$delete_product = Permission::create(['name' => 'delete product']);
$admin->syncPermissions([$create_product, $edit_product, $delete_product]);
}
Una vez creado el Seeder hay que registrarlo en el fichero DatabaseSeeder, para que se pueda ejecutar al realizar las migraciones, y colocarlo antes del Seeder de Usuarios
database\seeders\DatabaseSeeder.php
...
$this->call(RoleSeeder::class);
$this->call(UserSeeder::class);
...
Si se desea poner en este momento el rol al usuario, editar el fichero UserSeeder y colocar la asiganción del mismo
database\seeders\UserSeeder.php
public function run()
{
$user = User::create([
'name' => 'nombre',
'email' => '[email protected]',
'password' => bcrypt('mypass')
]);
$user->assignRole('admin');
User::factory(20)->create();
}
Ya solo queda aplicar las migraciones para aplicar estos cambios en roles y permisos. Atención al utlizar el parámetro fresh porque borra todos los datos de la base de datos.
Solo realizarlo en fase de desarrollo y sabiendo lo que se hace.
php artisan migrate:fresh
Diferencia entre Scopes y Permisos
Los Scopes se utilizan para dar permisos a ciertas acciones que se realizan con access token de API, por ejemplo un desarrolador tenga cobertura a ciertos campos.
Los Permisos se utilizan para dar acceso a cietas partes de la aplicación a nivel de usuario.
Implementar métodos CRUD
En cada método si lo requiere, se pasa por parámetro el modelo Role y su parámetro.
También se retorna a la vista correspondiente. Hay que crear las vistas y aplicarle la plantilla en su caso.
Para este ejemplo las vistas creadas van al llevar la plantilla de AdminLTE
@extends('adminlte::page')
@section('title', 'Dashboard')
@section('content_header')
<h1>Titulo de pagina</h1>
@stop
@section('content')
<p>Contenido de la página.</p>
@stop
@section('css')
<link rel="stylesheet" href="/css/admin_custom.css">
@stop
@section('js')
<script> console.log('Hi!'); </script>
@stop
Método index
public function index(){
return view('admin.roles.index');
}
Vista index
resources\views\admin\roles\index.blade.php
Método create
public function create(){
return view('admin.roles.create');
}
Vista create
resources\views\admin\roles\create.blade.php
Método store
public function store(Request $request){
}
Método show
public function show(Role $role){
return view('admin.roles.show', compact('role'));
}
Vista show
resources\views\admin\roles\show.blade.php
Método edit
public function edit(Role $role){
return view('admin.roles.edit');
}
Vista edit
resources\views\admin\roles\edit.blade.php
Método update
public function update(Request $request, Role $role){
}
Método destroy
public function destroy(Role $role){
//
}
Implementar rutas para CRUD con RESORUCE
En este caso se utiliza el metodo resource para generar automáticamente las 7 rutas necesarias para hacer un CRUD.
Ejemplo de ruta con resource a la ubicación de la vista
resources\views\admin\roles\
Route::resource('roles', RoleController::class)->names('admin.roles');
Visualizar rutas desde la consola de comandos
Para verificar que realmente se han creado las 7 rutas, se puede visualizar de la siguiente forma:
Abrir la consola de GitBash o cualquier otra, y en el raíz del proyecto ejecutar r:l
php artisan r:l
Más en concreto, para ver las rutas de admin.roles se añade al comando anterior
php artisan r:l --name=admin.role
Esto permite ahorar muchas líneas de código.
Deja una respuesta