Tutorial Laravel 5.8 completo para principantes en 2019

tutorial de Laravel 5.8
guía de laravel completa 2019

Laravel en los últimos años se ha convertido en uno de los frameworks de PHP más queridos y usados en el mundo, todo gracias a su sencillez y rapidez para desplegar nuevos proyectos en tiempos mínimos.

En este post encontrarás un tutorial de Laravel completo que te enseñará a como usar Laravel 5.8 para crear una aplicación CRUD básica. ¿Qué es una aplicación CRUD? Te puedes estar preguntando, una aplicación CRUD (Create Read Update Delete) es simplemente una aplicación en la que puedes crear, leer, actualizar y borrar datos y contenido de la base de datos que usa.

La aplicación CRUD de este tutorial de Laravel consistirá en una TO-DO list o lista de tareas, en la que podrás escribir tareas nuevas, marcarlas como terminadas, borrarlas de la lista y editarlas.

Instalación de Laravel

Laravel, para instalarse usa Composer, un administrador de paquetes de PHP. Así que antes de nada asegurate de instalar composer en tu ordenador.

Una vez asegurados de que tenemos composer instalado, abre el terminal de tu sistema y escribe el siguiente comando:

composer global require laravel/installer

Una vez terminada la instalación, para crear un proyecto usaremos el comando:

laravel new app-lista

Si la terminal te dice que no encuentra la orden laravel, puedes crear el proyecto desde composer con:

composer create-project -–prefer-dist laravel/laravel app-lista

Una vez creado, para comprobar que todo ha ido correctamente, vamos dentro de la carpeta del proyecto y lanzamos el servidor con:

php artisan serve

Podemos comprobar que se ha lanzado visitando 127.0.0.1:8000 desde el navegador, al entrar tendrás una página por defecto de Laravel como la de a continuación, con links útiles si necesitas información.

Página de bienvenida por defecto de Laravel 5.8

Una vez visto que todo va correctamente ya podemos empezar con el tutorial de Laravel. Voy a darte una pequeña explicación de la estructura del proyecto.

Estructura de un proyecto de Laravel

  • app: donde se localizan los modelos y la mayoría del código que escribiremos.
  • app/Http/Controllers: contiene los controladores que iremos creando y modificando.
  • app/Http/routes.php: aquí se escriben las rutas de la aplicación.
  • resources/views: carpeta donde se guardan las vistas.

Conforme se vaya avanzando en el tutorial de Laravel, iré explicando más de la estructura del proyecto.

Migraciones

Las migraciones sirven para crear el esquema de la base de datos de la aplicación del proyecto. Con ellas podemos describir con código los campos de una entidad o tabla y sus relaciones.

Antes de nada, debemos configurar el archivo .env, localizado en la carpeta raíz, para que apunte a la base de datos MYSQL local que hayamos creado para el proyecto.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app_lista
DB_USERNAME=tu_usuario
DB_PASSWORD=tu_contraseña

Una vez configurado el archivo .env, debemos empezar a crear la migración que cree la tabla ‘Tareas’, con la que trabajaremos para el resto del tutorial. Para crearla usaremos el siguiente comando en el terminal:

php artisan make:migration crear_tabla_tareas --create=tareas

Una vez creada, vamos a database/migrations y ahí verás que tienes tres migraciones, dos que crea Laravel por defecto y la que acabas de crear. Las que vienen por defecto son para gestión de usuarios, cosa que no vamos a utilizar en este tutorial, así que puedes borrarlas o ignorarlas.

Despues de esto, abre el archivo de la migración de tareas. Verás que por defecto ya viene con un ID autoincremental y los timestamps. A esto vamos a añadirle el campo nombre y el campo completado.

<?php

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

class CrearTablaTareas extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tareas', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nombre');
            $table->integer('completado');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tareas');
    }
}

En el campo nombre, guardaremos el título de la tarea por hacer y en completado guardaremos un número (0-1) que indicará si la tarea se ha terminado o está por hacer aún.

Una vez terminada la migración vamos a ejecutarla para que cree la tabla en la base de datos. Para ello vamos a ejecutar en el terminal el siguiente comando:

php artisan migrate

En la migración, la función up es la que indica que cambios se harán a la base de datos al ejecutar la migración y la función down indica que se hará cuando se haga un rollback

Modelos

Los modelos son lo que nos permite conectar la aplicación con la base de datos para interactuar con ella pudiendo insertar o coger datos de una tabla. Un modelo solo está corelacionado con una tabla de la base de datos.

Para crear un modelo podemos hacerlo con el siguiente comando:

php artisan make:model Tarea

Por defecto, Laravel ya relaciona el modelo con la tabla que tenga el mismo nombre pero el plural y escrito con snake_casing. Debido a que está en español el nombre de la tabla, por si acaso, vamos a indicarle al modelo que tabla es la correcta, si escribis el nombre de la tabla en inglés no debería haber problemas.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tarea extends Model
{
    protected $table = 'tareas';
}

Solo con esto, Laravel ya entiende que la clase Tarea está conectada con la tabla ‘tareas’ y los datos que recojas más adelante de la tabla serán objetos de esta misma clase.

Controladores

El controlador es el archivo donde escribiremos el código que servirá para introducir, devolver, modificar o eliminar registros de una tabla. Existe la alternativa de escribirlo directamente en las rutas, que luego veremos, pero pienso que es mejor dejar todo separado porque queda más claro.

Aquí tienes el comando para crear un controlador:

php artisan make:controller TareasController --resource --model=Tarea

Con las opciones –resource y –model=Tarea, le indicamos que es un controlador que manejará todas las peticiones HTTP del modelo que le indicamos, que en este caso es el que hemos creado antes, Tarea.

Aun que por defecto te haya creado 7 funciones, en este tutorial solo usaremos 4, index(), store(), update()y destroy(). Las otras funciones puedes borrarlas o ignorarlas.

En index() cogeremos todas las tareas de la base de datos y se la pasaremos en forma de array a una vista que crearemos en el siguiente paso.

public function index()
    {
        $tareas = Tarea::all();

        return view('index', ['tareas' => $tareas]);
    }

En store() validaremos los datos que vayamos a introducir y los introduciremos en la tabla de tareas y redireccionaremos a index de nuevo para que recargue la página.

public function store(Request $request)
    {
        $validador = Validator::make($request->all(), 
          [
            'nombre' => 'required|max:255',
          ]
        );

        if($validador->fails())
        {
          return redirect('/')->withInput()->withErrors($validador);
        }

        $tarea = new Tarea;
        $tarea->nombre = $request->nombre;
        $tarea->completado = 0;
        $tarea->save();

        return redirect('/');
    }

En update() actualizaremos el si la tarea ha sido terminada, una vez actualizado el registro se redireccionará a index para recargar la página.

public function update(Request $request, $id)
    {
      $tarea = Tarea::findOrFail($id);
      $tarea->completado = 1;
      $tarea->save();
    
      return redirect('/');
    }

En destroy() borraremos el registro que seleccionemos y volveremos a recargar la página redireccionando de nuevo a index.

public function destroy($id)
    {
      $tarea = Tarea::findOrFail($id);
      $tarea->delete();
      
      return redirect('/');
    }

Alfinal el controlador al completo queda así:

<?php

namespace App\Http\Controllers;

use App\Tarea;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Validator;

class TareasController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $tareas = Tarea::all();
        return view('index', ['tareas' => $tareas]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validador = Validator::make($request->all(), 
          [
            'nombre' => 'required|max:255',
          ]
        );

        if($validador->fails())
        {
          return redirect('/')->withInput()->withErrors($validador);
        }

        $tarea = new Tarea;
        $tarea->nombre = $request->nombre;
        $tarea->completado = 0;
        $tarea->save();

        return redirect('/');
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Tarea  $tarea
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
      $tarea = Tarea::findOrFail($id);
      $tarea->completado = 1;
      $tarea->save();
    
      return redirect('/');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Tarea  $tarea
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
      $tarea = Tarea::findOrFail($id);
      $tarea->delete();
      
      return redirect('/');
    }
}

Vistas

Las vistas son los archivos que contienen el código HTML y PHP que formarán lo que el usuario final vea en nuestra página web.

Gracias al motor de plantillas blade que trae Laravel, podemos usar estructuras de control, variables y funciones predefinidas que trae sin necesidad de usar la etiqueta <?php ?>.

Para crear una plantilla solamente tenemos que crearla como creariamos un archivo cualquiera pero con la extensión .blade.php, en este ejemplo haremos index.blade.php. Esta es la plantilla que usaremos:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>Lista de tareas</title>
        <!-- Fuentes -->
        <link
            href="https://fonts.googleapis.com/css?family=Nunito:200,600"
            rel="stylesheet"
        />
        <!-- Estilos -->
        <link
            rel="stylesheet"
            href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
            integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
            crossorigin="anonymous"
        />
        <script
            src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
            integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
            crossorigin="anonymous"
        ></script>
    </head>
    <body>
      <div style="padding: 60px 160px 0px 160px" class="container d-flex flex-column ">
            <p class="text-center">Nueva Tarea</p>
            @if(count($errors) > 0)
              <div class="alert alert-danger">
                <ul>
                @foreach($errors->all() as $error)
                  <li>{{$error}}</li>
                @endforeach
                </ul>
              </div>
            @endif
            <form action="/nueva-tarea/" method="POST" class="form-inline align-items-center justify-content-center">
            {{ csrf_field() }}
              <div class="form-group mx-sm-3 mb-2">
                <input class="form-control" id="nombre" name="nombre" placeholder="Tarea nueva">
              </div>
              <button type="submit" class="btn btn-success mb-2">Aceptar</button>
            </form>
        </div>

        <div style="padding: 40px 160px 0px 160px" class="container">
            <p class="text-center">Lista de Tareas</p>
            @if(count($tareas) > 0)
            <ul class="list-group">
              @foreach($tareas as $tarea)
              <li
                
                @if($tarea->completado == 1)
                  style="background-color: #d7ff7c"
                @endif

                class="list-group-item d-flex justify-content-between align-items-center action"
              >
                {{$tarea->nombre}}
                <div class="d-flex">

                  @if($tarea->completado == 0)

                  <form action="/editar/{{$tarea->id}}" method="POST" style="margin-right: 5px">
                  {{ csrf_field() }}
                    <button class="btn btn-info" type="submit">Terminado</button>
                  </form>

                  @endif

                  <form action="/borrar/{{$tarea->id}}" method="POST">
                    {{ csrf_field() }}
                    {{ method_field('DELETE') }}
                    <button class="btn btn-danger" type="submit">Borrar</button>
                  </form>
                </div>
              </li>
            @endforeach
          </ul>
          @endif
        </div>
        
    </body>
</html>

Al ver el código verás muchas cosas raras si no estas familiarizado con Blade, como por ejemplo {{ csrf_field() }}, qué es utilizado para en el formulario enviar un token que valida la autenticidad y ayuda contra ataques externos y es obligatorio en todos los formularios que hagas.

También está {{ method_field(‘DELETE’) }}, que sirve para hacer que un formulario pueda ser usado para el método DELETE, puesto que HTML no lo soporta de base.

Podemos usar, a parte de lo antes mencionado, las funciones @if y @foreach sin tener que abrir las etiquetas <?php ?>. Si te preguntas de donde sale la variable $tareas es la que hemos devuelto en el controlador con el método index().

Porcierto, no lo he dicho pero creo que habrás visto que para escribir una variable en la plantilla hay que escribirla entre dos llaves, tal que así {{ $variable }}.

Ahora recargas la página y…. no se ve ningún cambio o es posible que si has borrado la plantilla por defecto hasta de error. ¿Esto por qué es?

Esto es porque aún tenemos que trabajar en el último paso, las rutas.

Rutas

Las rutas son lo que le dicen a la aplicación que vistas renderizar cuando visitas un enlace de esta. Este apartado del tutorial es el mas sencillo de todos, puesto que solo es decirle que método de qué controlador debe ejecutar al visitar X url. En este caso solo necesitamos estas cuatro rutas:

<?php

Route::get('/', 'TareasController@index');

Route::post('/nueva-tarea', 'TareasController@store');
Route::post('/editar/{id}', 'TareasController@update');

Route::delete('/borrar/{id}', 'TareasController@destroy');

Ahora puedes acceder a la página y ya estará, podrás ver una interfaz sencilla en la que podrás crear una lista, decir si has terminado una tarea y borrarla.

tutorial de laravel para principiantes en 2019

Y con esto, ¡hemos terminado!. Como has podido ver con este tutorial, es muy fácil y sencillo el empezar a trabajar con Laravel.

Si te ha gustado, compártelo en las redes sociales!