Guía práctica de Laravel: Instalación y operaciones CRUD

Instalación del entorno de desarrollo

Primero, asegúrate de tener PHP, Composer y un servidor web local correctamente configurados.

Creación de un nuevo poryecto Laravel

composer global require laravel/installer
export PATH=$PATH:~/.config/composer/vendor/bin
# Crear aplicación
laravel new articulos
cd articulos
php artisan serve
# Acceder en http://localhost:8000

Alternativamente:

composer create-project --prefer-dist laravel/laravel articulos

Configuración de la base de datos

Edita el archivo .env con los datos de conexión:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_articulos
DB_USERNAME=root
DB_PASSWORD=

Migración de la base de datos

Genera una migración para la tabla articles:

php artisan make:migration create_articles_table --create=articles

Edita el archivo generado en database/migrations/2020_05_06_073654_create_articles_table.php (la fecha será diferente):

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateArticlesTable extends Migration
{
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Ejecuta la migración:

php artisan migrate

Definición de rutas

En routes/web.php añade:

Route::resource('articles', 'ArticleController');

Creación del controlador y modelo

php artisan make:controller ArticleController --resource --model=Article

Modelo

app/Article.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = ['title', 'body'];
}

Controlador

app/Http/Controllers/ArticleController.php:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function index()
    {
        $items = Article::latest()->paginate(5);
        return view('articles.index', compact('items'))
            ->with('i', (request()->input('page', 1) - 1) * 5);
    }

    public function create()
    {
        return view('articles.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required',
            'body' => 'required',
        ]);
        Article::create($request->all());
        return redirect()->route('articles.index')
            ->with('success', 'Artículo creado exitosamente.');
    }

    public function show(Article $article)
    {
        return view('articles.show', compact('article'));
    }

    public function edit(Article $article)
    {
        return view('articles.edit', compact('article'));
    }

    public function update(Request $request, Article $article)
    {
        $request->validate([
            'title' => 'required',
            'body' => 'required',
        ]);
        $article->update($request->all());
        return redirect()->route('articles.index')
            ->with('success', 'Artículo actualizado correctamente.');
    }

    public function destroy(Article $article)
    {
        $article->delete();
        return redirect()->route('articles.index')
            ->with('success', 'Artículo eliminado correctamente.');
    }
}

Vistas

resources/views/articles/layout.blade.php:

<html>
<head>
    <title>Gestión de Artículos - Laravel</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
    @yield('content')
</div>
</body>
</html>

resources/views/articles/index.blade.php:

@extends('articles.layout')

@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Lista de Artículos</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-success" href="{{ route('articles.create') }}"> Crear Nuevo Artículo</a>
            </div>
        </div>
    </div>

    @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
    @endif

    <table class="table table-bordered">
        <tr>
            <th>No</th>
            <th>Título</th>
            <th>Cuerpo</th>
            <th width="280px">Acción</th>
        </tr>
        @foreach ($items as $item)
        <tr>
            <td>{{ ++$i }}</td>
            <td>{{ $item->title }}</td>
            <td>{{ $item->body }}</td>
            <td>
                <form action="{{ route('articles.destroy', $item->id) }}" method="POST">
                    <a class="btn btn-info" href="{{ route('articles.show', $item->id) }}">Ver</a>
                    <a class="btn btn-primary" href="{{ route('articles.edit', $item->id) }}">Editar</a>
                    @csrf
                    @method('DELETE')
                    <button type="submit" class="btn btn-danger">Eliminar</button>
                </form>
            </td>
        </tr>
        @endforeach
    </table>

    {!! $items->links() !!}
@endsection

resources/views/articles/create.blade.php:

@extends('articles.layout')

@section('content')
<div class="row">
    <div class="col-lg-12 margin-tb">
        <div class="pull-left">
            <h2>Agregar Nuevo Artículo</h2>
        </div>
        <div class="pull-right">
            <a class="btn btn-primary" href="{{ route('articles.index') }}"> Volver</a>
        </div>
    </div>
</div>

@if ($errors->any())
    <div class="alert alert-danger">
        <strong>¡Ups!</strong> Hay problemas con los datos ingresados.<br><br>
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<form action="{{ route('articles.store') }}" method="POST">
    @csrf

    <div class="row">
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Título:</strong>
                <input type="text" name="title" class="form-control" placeholder="Título">
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Cuerpo:</strong>
                <textarea class="form-control" style="height:150px" name="body" placeholder="Contenido"></textarea>
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12 text-center">
            <button type="submit" class="btn btn-primary">Guardar</button>
        </div>
    </div>
</form>
@endsection

resources/views/articles/edit.blade.php:

@extends('articles.layout')

@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Editar Artículo</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('articles.index') }}"> Volver</a>
            </div>
        </div>
    </div>

    @if ($errors->any())
        <div class="alert alert-danger">
            <strong>¡Ups!</strong> Revisa los errores.<br><br>
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    <form action="{{ route('articles.update', $article->id) }}" method="POST">
        @csrf
        @method('PUT')

        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Título:</strong>
                    <input type="text" name="title" value="{{ $article->title }}" class="form-control" placeholder="Título">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Cuerpo:</strong>
                    <textarea class="form-control" style="height:150px" name="body" placeholder="Contenido">{{ $article->body }}</textarea>
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12 text-center">
                <button type="submit" class="btn btn-primary">Actualizar</button>
            </div>
        </div>
    </form>
@endsection

resources/views/articles/show.blade.php:

@extends('articles.layout')
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Ver Artículo</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('articles.index') }}"> Volver</a>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Título:</strong>
                {{ $article->title }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Cuerpo:</strong>
                {{ $article->body }}
            </div>
        </div>
    </div>
@endsection

Ejecutar la aplicación

Abre la URL http://localhost:8000/articles en tu navegador para comenzar a usar el CRUD.

Etiquetas: Laravel CRUD PHP Migraciones Blade

Publicado el 6-8 20:14