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.