![10.-Laravel Tutorial en Español [crud] ¡¡En tiempo récord⚡!! 1 10. Curso de Laravel](https://www.programadornovato.com/wp-content/uploads/2019/03/10.-Curso-de-Laravel-535x251.png)
10.-Laravel Tutorial en Español [crud] ¡¡En tiempo récord⚡!!
INTRODUCCION
INSTALACION DE LARAVEL
Nos ubicamos en la carpeta de nuestra instalación de xampp en mi caso
cd /var/www/html
Creamos el proyecto de laravel con este comando
composer create-project laravel/laravel crudlaravel
Recordemos editar el archivo .env que esta en la raíz del proyecto con los accesos a nuestra bd.
Entramos en la carpeta del proyecto
cd crudlaravel
MIGRACIÓN Y MODELO
Creamos una migración
php artisan make:migration create_libros_table
Se creo un archivo en database/migrations/fecha_hash_create_libros_table.php lo editamos y debe quedar asi:
<?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateLibrosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('libros', function (Blueprint $table) { $table->increments('id'); $table->string('nombre'); $table->string('resumen'); $table->integer('npagina'); $table->integer('edicion'); $table->string('autor'); $table->decimal('precio',5,2); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('libros'); } }
Ejecutamos la migracion:
php artisan migrate
Ahora creamos el modelo
php artisan make:model Libro
Se creo el archivo app/Libro.php ahora lo editamos para que quede asi:
<?php namespace App; use IlluminateDatabaseEloquentModel; class Libro extends Model { // protected $fillable = ['nombre', 'resumen', 'npagina','edicion','autor','precio']; }
CONTROLADOR
Ahora creamos el controlador ejecutando este comando:
php artisan make:controller LibroController --resource
Se genero este archivo app/Http/Controllers/LibroController.php lo editamos para que quede asi:
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppLibro; class LibroController extends Controller { /** * Display a listing of the resource. * * @return IlluminateHttpResponse */ public function index() { // $libros=Libro::orderBy('id','DESC')->paginate(3); return view('Libro.index',compact('libros')); } /** * Show the form for creating a new resource. * * @return IlluminateHttpResponse */ public function create() { // return view('Libro.create'); } /** * Store a newly created resource in storage. * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function store(Request $request) { // $this->validate($request,[ 'nombre'=>'required', 'resumen'=>'required', 'npagina'=>'required', 'edicion'=>'required', 'autor'=>'required', 'npagina'=>'required', 'precio'=>'required']); Libro::create($request->all()); return redirect()->route('libro.index')->with('success','Registro creado satisfactoriamente'); } /** * Display the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function show($id) { // $libros=Libro::find($id); return view('Libro.show',compact('libros')); } /** * Show the form for editing the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function edit($id) { // $libro=libro::find($id); return view('Libro.edit',compact('libro')); } /** * Update the specified resource in storage. * * @param IlluminateHttpRequest $request * @param int $id * @return IlluminateHttpResponse */ public function update(Request $request, $id) { // $this->validate($request,[ 'nombre'=>'required', 'resumen'=>'required', 'npagina'=>'required', 'edicion'=>'required', 'autor'=>'required', 'npagina'=>'required', 'precio'=>'required']); libro::find($id)->update($request->all()); return redirect()->route('libro.index')->with('success','Registro actualizado satisfactoriamente'); } /** * Remove the specified resource from storage. * * @param int $id * @return IlluminateHttpResponse */ public function destroy($id) { // Libro::find($id)->delete(); return redirect()->route('libro.index')->with('success','Registro eliminado satisfactoriamente'); } }
RUTAS
Vamos a las rutas en el archivo routes/web.php y lo editamos para que quede asi:
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::resource('libro', 'LibroController');
VISTAS
Creanos la carpeta /resources/views/layouts y dentro de layouts creamos el archivo layout.blade.php donde colocaremos este codigo:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes"> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> </head> <body> <div class="container-fluid" style="margin-top: 100px"> @yield('content') </div> <style type="text/css"> .table { border-top: 2px solid #ccc; } </style> </body> </html>
Creanos la carpeta /resources/views/Libro y dentro de Libro creamos el archivo index.blade.php donde colocaremos este codigo:
@extends('layouts.layout')
@section('content')
<div class="row">
<section class="content">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-body">
<div class="pull-left"><h3>Lista Libros</h3></div>
<div class="pull-right">
<div class="btn-group">
<a href="{{ route('libro.create') }}" class="btn btn-info" >Añadir Libro</a>
</div>
</div>
<div class="table-container">
<table id="mytable" class="table table-bordred table-striped">
<thead>
<th>Nombre</th>
<th>Resumen</th>
<th>No. Páginas</th>
<th>Edicion</th>
<th>Autor</th>
<th>Precio</th>
<th>Editar</th>
<th>Eliminar</th>
</thead>
<tbody>
@if($libros->count())
@foreach($libros as $libro)
<tr>
<td>{{$libro->nombre}}</td>
<td>{{$libro->resumen}}</td>
<td>{{$libro->npagina}}</td>
<td>{{$libro->edicion}}</td>
<td>{{$libro->autor}}</td>
<td>{{$libro->precio}}</td>
<td><a class="btn btn-primary btn-xs" href="{{action('LibroController@edit', $libro->id)}}" ><span class="glyphicon glyphicon-pencil"></span></a></td>
<td>
<form action="{{action('LibroController@destroy', $libro->id)}}" method="post">
{{csrf_field()}}
<input name="_method" type="hidden" value="DELETE">
<button class="btn btn-danger btn-xs" type="submit"><span class="glyphicon glyphicon-trash"></span></button>
</td>
</tr>
@endforeach
@else
<tr>
<td colspan="8">No hay registro !!</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
{{ $libros->links() }}
</div>
</div>
</section>
@endsection
Dentro de la carpeta /resources/views/Libro creamos el archivo create.blade.php donde colocaremos este codigo:
@extends('layouts.layout')
@section('content')
<div class="row">
<section class="content">
<div class="col-md-8 col-md-offset-2">
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Error!</strong> Revise los campos obligatorios.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if(Session::has('success'))
<div class="alert alert-info">
{{Session::get('success')}}
</div>
@endif
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Nuevo Libro</h3>
</div>
<div class="panel-body">
<div class="table-container">
<form method="POST" action="{{ route('libro.store') }}" role="form">
{{ csrf_field() }}
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="nombre" id="nombre" class="form-control input-sm" placeholder="Nombre del libro">
</div>
</div>
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="npagina" id="npagina" class="form-control input-sm" placeholder="Número de Páginas">
</div>
</div>
</div>
<div class="form-group">
<textarea name="resumen" class="form-control input-sm" placeholder="Resumen"></textarea>
</div>
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="edicion" id="edicion" class="form-control input-sm" placeholder="Edición del libro">
</div>
</div>
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="precio" id="precio" class="form-control input-sm" placeholder="Precio del libro">
</div>
</div>
</div>
<div class="form-group">
<textarea name="autor" class="form-control input-sm" placeholder="Autor"></textarea>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<input type="submit" value="Guardar" class="btn btn-success btn-block">
<a href="{{ route('libro.index') }}" class="btn btn-info btn-block" >Atrás</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
@endsection
Dentro de la carpeta /resources/views/Libro creamos el archivo edit.blade.php donde colocaremos este codigo:
@extends('layouts.layout')
@section('content')
<div class="row">
<section class="content">
<div class="col-md-8 col-md-offset-2">
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Error!</strong> Revise los campos obligatorios.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if(Session::has('success'))
<div class="alert alert-info">
{{Session::get('success')}}
</div>
@endif
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Nuevo Libro</h3>
</div>
<div class="panel-body">
<div class="table-container">
<form method="POST" action="{{ route('libro.update',$libro->id) }}" role="form">
{{ csrf_field() }}
<input name="_method" type="hidden" value="PATCH">
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="nombre" id="nombre" class="form-control input-sm" value="{{$libro->nombre}}">
</div>
</div>
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="npagina" id="npagina" class="form-control input-sm" value="{{$libro->npagina}}">
</div>
</div>
</div>
<div class="form-group">
<textarea name="resumen" class="form-control input-sm" placeholder="Resumen">{{$libro->resumen}}</textarea>
</div>
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="edicion" id="edicion" class="form-control input-sm" value="{{$libro->edicion}}">
</div>
</div>
<div class="col-xs-6 col-sm-6 col-md-6">
<div class="form-group">
<input type="text" name="precio" id="precio" class="form-control input-sm" value="{{$libro->precio}}">
</div>
</div>
</div>
<div class="form-group">
<textarea name="autor" class="form-control input-sm" placeholder="Autor">{{$libro->autor}}</textarea>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<input type="submit" value="Actualizar" class="btn btn-success btn-block">
<a href="{{ route('libro.index') }}" class="btn btn-info btn-block" >Atrás</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
@endsection
Ave que vuela, a la cazuela.