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.