Laravel 8 - Ejemplo de controlador CRUD

Más
2 años 2 meses antes - 2 años 2 meses antes #21 por luispindola
Laravel 8 - Ejemplo de controlador CRUD Publicado por luispindola
Vista de formulario (form.blade.php)
@extends('layout.fixednavbar')

@section('contenido')
    <h1>@if(isset($user))
        Edita Usuario
    @else
        Nuevo Usuario
    @endif</h1>
    <form 
        name="form1" 
        role="form" 
        method="post" 
        @if(isset($user)){{-- varia el url del acction dependiendo si esta editando o creando --}}
            action="{{url('/usuarios/'.$user->id.'/edit')}}">
        @else
            action="{{url('/usuarios')}}">
        @endif
        
        @csrf

        @if(isset($user))
            {{-- Solo cuando se va a editar --}}
            @method('PUT')
        @endif
        
        @if ($errors->any())
            <div class="alert alert-danger alert-dismissable">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif

        <div class="mb-3">
          <label for="nombre" class="form-label">Nombre:</label>
          <input type="text" class="form-control @error('nombre') is-invalid @enderror" id="nombre" 
          name="nombre" 
          value="@if(isset($user)){{$user->name}}@else{{old('nombre')}}@endif" 
          placeholder="Nombre de usuario">
          @error('nombre')<div class="alert alert-danger">{{ $message }}</div>@enderror
        </div>

        <div class="mb-3">
          <label for="email" class="form-label">Correo electrónico:</label>
          <input type="mail" class="form-control @error('email') is-invalid @enderror" id="email" 
          name="email"
          value="@if(isset($user)){{$user->email}}@else{{old('email')}}@endif" 
          placeholder="Correo electrónico">
          @error('email')<div class="alert alert-danger">{{ $message }}</div>@enderror
        </div>

        <div class="mb-3">
          <label for="password" class="form-label">Contraseña:</label>
          <input type="password" class="form-control @error('password') is-invalid @enderror" id="password" 
          name="password"
          value="@if(isset($user)){{Crypt::decrypt($user->password,0)}}@else{{old('password')}}@endif" 
          placeholder="Contraseña">
          @error('password')<div class="alert alert-danger">{{ $message }}</div>@enderror
        </div>

        <div class="mb-3">
          <label for="password_confirmation" class="form-label">Confirmar Contraseña:</label>
          <input type="password" class="form-control @error('password2') is-invalid @enderror" id="password_confirmation" 
          name="password_confirmation"
          value="@if(isset($user)){{Crypt::decrypt($user->password,0)}}@else{{old('password_confirmation')}}@endif" 
          placeholder="Confirmar Contraseña">
          @error('password_confirmation')<div class="alert alert-danger">{{ $message }}</div>@enderror
        </div>
        
        <div class="mb-3">     
          <button type="submit" class="btn btn-primary mb-3">Crear usuario</button>
        </div>
    </form>

@endsection


Vista formulario show: (show.blade.php)
@extends('layout.fixednavbar')

@section('contenido')
    <h1>Datos de usuario {{$user->id}}</h1>                                        

        <div class="mb-3">
          <label for="nombre" class="form-label">Nombre:</label>
          <p><strong>{{$user->name}}</strong></p>
        </div>

        <div class="mb-3">
          <label for="email" class="form-label">Correo electrónico:</label>
          <p><strong>{{$user->email}}</strong></p>
        </div>

        <div class="mb-3">
          <label for="password" class="form-label">Contraseña:</label>
          <p><strong>{{Crypt::decrypt($user->password,0)}}</strong></p>
        </div>

        <form name="form1" 
        role="form" 
        method="post" 
        action="{{url('/usuarios/'.$user->id)}}">
        <div class="mb-3">
          @csrf
          @method('DELETE')
          <a class="btn btn-primary mb-3" href="{{url('/')}}">Regresar</a>
          <button type="submit" class="btn btn-warning mb-3">Eliminar usuario</button>
        </div>
        </form>
    
@endsection


El controlador Usuarios.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Validation\Rule;
use Illuminate\Database\Eloquent\ModelNotFoundException; 
use App\Models\User;

class Usuarios extends Controller
{
    public function create()    
    {   //MUESTRA FORMULARIO VACIO
        return view('usuarios.form');
    }

    public function store(Request $request)
    {   //RECIBE EL POST DEL CREATE        
        $request->validate([
            'nombre'                    => 'required|min:8',
            'email'                     => 'required|email|unique:App\Models\User,email',
            'password'                  => 'required|min:8|confirmed',
            'password_confirmation'     => 'required'
        ]);

        $user = User::create([
            'name'          =>  $request->nombre,
            'email'         =>  $request->email,
            'password'      =>  Crypt::encryptString($request->password)
        ]);
        $user->save();

        return redirect('/')->with(['mensaje' =>  'Se creo usuario correctamente','tipo' =>  'success']);
    }

    public function edit($user_id)
    {
        $user = User::find($user_id);        
        if(isset($user)) //Revisa que el usuario exista
        {
            $pass = Crypt::decrypt($user->password,0);
            return view('usuarios.form',['user'   =>  $user]);
        }
        else
        {
            throw new ModelNotFoundException();
        }
    }

    public function update($user_id, Request $request)
    {
        $user = User::find($user_id);
        if(isset($user)) //Revisa que el usuario exista
        {
            $request->validate([
                'nombre'                    => 'required|min:8',
                'email'                     => 'required|email|unique:App\Models\User,email',
                'email'                     =>  [
                                                    'required','email',
                                                    Rule::unique('users')->ignore($user->id),
                                                ],
                'password'                  => 'required|min:8|confirmed',
                'password_confirmation'     => 'required'
            ]);

            $user = User::find($user_id);
            $user->name = $request->nombre;
            $user->email = $request->email;
            $user->password = Crypt::encryptString($request->password);
            $user->save();

            return redirect('/')->with(['mensaje' =>  'Se editó usuario correctamente','tipo' =>  'info']);
        }
        else
        {
            throw new ModelNotFoundException();
        }
    }

    public function show($user_id)
    {
        $user = User::find($user_id);
        if(isset($user))
        {
            return view('usuarios.show',['user' =>  $user]);
        }
        else
        {
            throw new ModelNotFoundException();
        }
    }

    public function destroy($user_id)
    {
        $user = User::find($user_id);
        if(isset($user))
        {
            $user->delete();
            return redirect('/')->with(['mensaje' =>  'Se eliminó usuario correctamente','tipo' =>  'warning']);
        }
        else
        {
            throw new ModelNotFoundException();
        }
    }    
}


Y las rutas de web.php
Route::get('/usuarios', [Usuarios::class, 'create']);
Route::post('/usuarios', [Usuarios::class, 'store']);
Route::get('/usuarios/{id}/edit',[Usuarios::class, 'edit']);
Route::put('/usuarios/{id}/edit',[Usuarios::class, 'update']);
Route::get('/usuarios/{id}',[Usuarios::class, 'show']);
Route::delete('/usuarios/{id}',[Usuarios::class, 'destroy']);


 
Última Edición: 2 años 2 meses antes por luispindola.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.093 segundos