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
Índice
  1. Crear un crud controller en laravel
  2. Crud controller con Laravel Permission
  3. Implementar métodos CRUD
  4. Implementar rutas para CRUD con RESORUCE

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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir