# Guía Rápida: Aplicación Laravel con Breeze y CRUD Básico
## 1. Instalación de Laravel
```bash
cd /var/www/html/
sudo composer create-project laravel/laravel NOMBRE_APP
sudo chmod -Rf 777 NOMBRE_APP
```
## 2. Instalación de Laravel Breeze
```bash
nvm install v20.9.0 #instalar node en la ultima version estable
composer require laravel/breeze --dev
php artisan breeze:install
npm install
npm run dev
```
## 3. Crear y Configuración de la Base de Datos
Crear la base de datos en http://localhost/phpmyadmin/
Editar .env y configurar las opciones de la base de datos:
```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nombre_base_datos
DB_USERNAME=usuario
DB_PASSWORD=contraseña
```
Donde Modelo es el nombre de tu modelo.
```bash
php artisan migrate
```
## 5. Crear Modelo, Controlador, Factory, y Migración para CRUD
```bash
php artisan make:model -mrcf Modelo
#Donde Modelo es el nombre de tu modelo.
```
## 6. Definir la Migración
Editar el archivo de migración en database/migrations para añadir campos necesarios.
```php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateIncidenciasTable extends Migration
{
public function up()
{
Schema::create('incidencias', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->string('reparador');
$table->string('lugar');
$table->date('fecha_reparacion')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('incidencias');
}
}
```
## 7. Definir el Modelo
Editar el modelo en app/Models para añadir propiedades $fillable o $guarded.
Recuerda que los campos deben coincidir con migration, factory etc..
```php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Incidencia extends Model
{
use HasFactory;
protected $fillable = ['nombre', 'reparador', 'lugar', 'fecha_reparacion'];
}
```
## 8. Crear Factory
Cuando creamos el Modelo con -mcf debio crearse un archivo [NOMBRE]Factory.php en database/factories.
Si no se creó lo creamos con "php artisan make:factory [NOMBRE]Factory --model=[NOMBRE]
```php
namespace Database\Factories;
use App\Models\Incidencia;
use Illuminate\Database\Eloquent\Factories\Factory;
class IncidenciaFactory extends Factory
{
protected $model = Incidencia::class;
public function definition()
{
return [
'nombre' => $this->faker->word,
'reparador' => $this->faker->name,
'lugar' => $this->faker->address,
'fecha_reparacion' => $this->faker->date,
];
}
}
```
## 9. Crear Seeder
Para llenar tu base de datos con datos de prueba para el modelo [NOMBRE], crea un Seeder:
```php
php artisan make:seeder [NOMBRE]TableSeeder
```
Esto creará un archivo [NOMBRE]TableSeeder.php en database/seeders. Edita este archivo para usar el Factory:
```php
namespace Database\Seeders;
use App\Models\Incidencia;
use Illuminate\Database\Seeder;
class [NOMBRE]TableSeeder extends Seeder
{
public function run()
{
[NOMBRE]::factory()->count(50)->create();
}
}
```
## 10. Definir Rutas
Editar routes/web.php para definir las rutas del CRUD.
```php
use App\Http\Controllers\NombreController;
//Esto que viene ahora valdria igual que poner todas las rutas del CRUD
Route::resource('incidencias', IncidenciaController::class);
// Rutas CRUD para 'Incidencias'
/*Route::get('/incidencias', [IncidenciaController::class, 'index'])->name('incidencias.index');
Route::get('/incidencias/create', [IncidenciaController::class, 'create'])->name('incidencias.create');
Route::post('/incidencias', [IncidenciaController::class, 'store'])->name('incidencias.store');
Route::get('/incidencias/{incidencia}', [IncidenciaController::class, 'show'])->name('incidencias.show');
Route::get('/incidencias/{incidencia}/edit', [IncidenciaController::class, 'edit'])->name('incidencias.edit');
Route::put('/incidencias/{incidencia}', [IncidenciaController::class, 'update'])->name('incidencias.update');
Route::delete('/incidencias/{incidencia}', [IncidenciaController::class, 'destroy'])->name('incidencias.destroy');*/
```
## 11. Implementar Métodos en el Controlador
Editar el controlador en app/Http/Controllers para implementar los métodos del CRUD.
```php
namespace App\Http\Controllers;
use App\Models\Incidencia;
use Illuminate\Http\Request;
class IncidenciaController extends Controller
{
// Muestra la lista de incidencias
public function index()
{
$incidencias = Incidencia::all();
return view('incidencias.index', compact('incidencias'));
}
// Muestra el formulario para crear una nueva incidencia
public function create()
{
return view('incidencias.create');
}
// Guarda una nueva incidencia en la base de datos
public function store(Request $request)
{
$validatedData = $request->validate([
'nombre' => 'required|string|max:255',
'reparador' => 'required|string|max:255',
'lugar' => 'required|string|max:255',
'fecha_reparacion' => 'nullable|date',
]);
Incidencia::create($validatedData);
return redirect()->route('incidencias.index')->with('success', 'Incidencia creada con éxito.');
}
// Muestra una incidencia específica
public function show(Incidencia $incidencia)
{
return view('incidencias.show', compact('incidencia'));
}
// Muestra el formulario para editar una incidencia existente
public function edit(Incidencia $incidencia)
{
return view('incidencias.edit', compact('incidencia'));
}
// Actualiza una incidencia específica en la base de datos
public function update(Request $request, Incidencia $incidencia)
{
$validatedData = $request->validate([
'nombre' => 'required|string|max:255',
'reparador' => 'required|string|max:255',
'lugar' => 'required|string|max:255',
'fecha_reparacion' => 'nullable|date',
]);
$incidencia->update($validatedData);
return redirect()->route('incidencias.index')->with('success', 'Incidencia actualizada con éxito.');
}
// Elimina una incidencia específica de la base de datos
public function destroy(Incidencia $incidencia)
{
$incidencia->delete();
return redirect()->route('incidencias.index')->with('success', 'Incidencia eliminada con éxito.');
}
}
```
## 12. Creamos las 4 vistas necesarias INDEX, CREATE, EDIT Y SHOW (todas .blade.php)
Creamos el directorio layout y dentro la vista [NOMBRE].blade.php
```blade
@extends('layouts.incidencia')
@section('content')
[AQUI LO NECESARIO EN CADA VISTA]
@endsection
```
## Problema con $slots.
Si no funciona simplemente quitamos los {{}} y lo sustituimos por un @yield('content')