Hola que tal, bienvenido a este nuevo artículo en donde aprenderás cómo crear un crud en Laravel 5.5 desde cero, lo que vamos hacer es básicamente crear las opciones de crear, leer, actualizar y eliminar que son las opciones básicas que tiene una tabla, para esto usaremos Laravel que es un Framework para PHP que como se verá a continuación nos ayuda y nos abstrae la creación de un motón de código simplemente con usar comandos vía consola.
INSTALACIÓN DE LARAVEL VÍA COMPOSER
Previamente debemos tener instalado XAMPP y en la ubicación C:\xampp\htdocs abrimos una ventana de comandos e instalamos usando el siguientes comando:
| composer create-project laravel/laravel=5.5 crudlaravel |
Como te darás cuenta dependiendo la velocidad de tu conexión a internet esto puede o no tardar mucho.
Bien, ahora que ya tenemos creado el proyecto lo primero que vamos hacer es cambiar la configuración para la base de datos, usuario y clave, si aún no lo has hecho puedes ver el artículo anterior Cómo instalar y configurar Laravel 5.5 donde explico como hacerlo. El nombre de la base de datos le llamaremos del mismo nombre del proyecto crudlaravel, posteriormente deberás crear la base de datos en MySQL.
CREACIÓN DE MIGRACIONES
El tema de migraciones en Laravel tiene que ver con el diseño de tablas de nuestra base de datos, y aunque podemos directamente crear nuestra tabla en MySQL crear el controlador y el modelo, lo vamos hacer usando migraciones, cual es la diferencia? Pues la diferencia es que usando migraciones diseñas las tablas como si de modelos se tratarán y luego las puedes generar a MySQL con un sólo comando, además puedes llevar la cronología de la creación de tus tablas y si algo salió mal, por ejemplo te olvidaste de crear un campo, fácilmente haces un rollback y deshaces los cambios. Pero bueno para que se entienda mejor vamos al ejemplo.
La tabla que vamos a crear para el ejemplo se va llamar Libros y contendrá los campos: nombre, resumen, número de páginas, edición, autor y precio.
Para crear la tabla creamos un archivo de migración, para esto vamos a la ventana de comandos abierta anteriormente y usamos el siguiente comando:
| php artisan make:migration create_libros_table |
Si te das cuenta ahora se creó un nuevo archivo dentro de la carpeta database->migratios 2018_01_26_035203_create_libros_table.php.
Es una clase que hereda de la clase Migration, en esta clase definimos los campos que va contener la tabla Libros, en esta clase hay dos métodos dow que se llama cuando ejecutamos un rollback y up que es donde crearemos los campos para nuestra tabla, el archivo debe quedar como se muestra a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; 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'); } } |
Ahora lo que nos queda es ejecutar la migración, esto para que se cree nuestra tabla libros, para esto ejecutamos el siguiente comando:
Lo que nos queda es revisar la tabla libros, para esto puedes usar phpMyadmin o si usas MySQL Workbeanch puedes ver que efectivamente se creó la tabla libros junto con otras adicionales.
Bien, como te mencionaba en ciertos casos pueda que que quieras añadir algún campo a alguna tabla que ya está creada, simplemente puedes hacer un rollback, lo que hace en este caso es eliminar las tablas creadas con las migraciones, la base de datos queda vacía sin ninguna tabla, puedes probar el siguiente comando y verás que pasa:
| php artisan migrate:rollback |
Si de nuevo revisas la base de datos te darás cuenta que la base de datos volvió a su estado inicial y como este comando era sólo para probar, debes volver a generar el comando migrate para crear la tabla libros.
CREAR EL MODELO
Ahora que y tenemos la tabla creada, necesitamos un modelo que mapee los campos a la tabla libros y para esto usamos el comando:
| php artisan make:model Libro |
Si vas a la carpeta app del proyecto vas a encontrar un nuevo archivo llamado Libro.php, como te darás cuenta es una clase vacía y en teoría deberíamos crear las propiedades, los setter y getter, pero con la ayuda de Laravel sólo creamos un array $fillable y le pasamos los campos que queremos llenar, así de fácil como se muestra a continuación:
| <?php namespace App; use Illuminate\Database\Eloquent\Model; class Libro extends Model { // protected $fillable = ['nombre', 'resumen', 'npagina','edicion','autor','precio']; } |
CREAR EL CONTROLLER
Laravel es un Framework que usa el patrón MVC (Modelo, Vista, Controlador), por lo que ahora tenemos que crear el controlador con los métodos index, show, update, delete.
Como te habrás dado cuenta hasta ahora hemos generado todo básicamente a través de comandos y bueno esta vez no es la excepción, así que para crear el controlador usamos el siguiente comando:
| php artisan make:controller LibroController --resource |
Si ahora vas a la carpeta app/Http/Controllers puedes ver que se generó un nuevo archivo VideoController.php y como por arte de magia se crearon todos los métodos que necesitamos, a continuación dejo el código para cada uno de los métodos, que como te darás cuenta es corto y sencillo, puesto que el framework prácticamente hace todo por nosotros.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Libro; class LibroController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ 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 \Illuminate\Http\Response */ public function create() { // return view('Libro.create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ 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 \Illuminate\Http\Response */ 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 \Illuminate\Http\Response */ public function edit($id) { // $libro=libro::find($id); return view('libro.edit',compact('libro')); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ 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 \Illuminate\Http\Response */ public function destroy($id) { // Libro::find($id)->delete(); return redirect()->route('libro.index')->with('success','Registro eliminado satisfactoriamente'); } } |
CREAR LAS RUTAS
Una ruta en Laravel indica a que método del controlador debe direccionar una petición por ejemplo cuando queramos crear un nuevo libro, editar etc., para esto vamos a la carpeta routes y al archivo web.php el cual debe quedar como sigue:
| <?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::resource('libro', 'LibroController'); |
CREAR LAS VISTAS
Finalmente lo que vamos hacer es crear las vistas, para mostrar, editar y eliminar libros, para esto vamos a /resources/views/ y creamos una nueva carpeta llamada layouts y dentro de esta carpeta creamos el archivo layout.blade.php, este archivo tiene la plantilla del proyecto, es importante mencionar que Laravel usa el motor de plantillas blade que junto con HTML permiten crear vistas más simples y limpias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!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> |
ARCHIVO INDEX.BLADE.PHP
Posteriormente en la ruta /resources/views/ creamos una nueva carpeta llamada Libro que va contener las vistas (index, create, show, edit). Dentro de esta carpeta creamos el archivo index.blade.php como se muestra a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | @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 |
ARCHIVO CREATE.BLADE.PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | @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 |
ARCHIVO EDIT.BLADE.PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | @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 |
Y bien como puedes ver que en cuestión de minutos puedes crear un CRUD con Laravel, a continuación dejo el enlace desde el repositorio de Github para que lo descargues Descarga Crud en Laravel desde Github. También puedes continuar revisando Cómo crear un servicio Api REST y consumirlo desde Android.
0 Comentarios