Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:frameworks:laravel

Laravel

Framework PHP

Las notas que aquí se recogen están centradas en la versión 12 de Laravel

Índice

Requisitos

Para que Laravel funcione correctamente, el servidor web que lo correrá debe tener la siguiente versión de PHP y extensiones:

  • PHP >= 8.2
  • Ctype PHP Extension
  • cURL PHP Extension
  • DOM PHP Extension
  • Fileinfo PHP Extension
  • Filter PHP Extension
  • Hash PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PCRE PHP Extension
  • PDO PHP Extension
  • Session PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

Para instalar PHP y el resto de dependencias, existe el siguiente script:

/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"

Instalación

Instalador laravel

Laravel utiliza Composer para gestionar sus dependencias, así que es necesario que Composer esté instalado previamente.

Descargamos el instalador de Laravel:

composer global require laravel/installer

Para crear un proyecto Laravel:

laravel new nombre-proyecto

Esto descargará los archivos necesarios y los guardará en el directorio desde el que ejecutemos el comando. Además, se iniciará un asistente para realizar una configuración básica de nuestro proyecto.

Hay que revisar el PATH para confirmar que esté incluido el directorio donde composer instala las herramientas de terceros. Por ejemplo, si tras hacer composer global require laravel/installer, el instalador de Laravel se instala en /home/fulanito/.config/composer/vendor/bin, lo añadiremos al PATH. Ejemplo en Linux con el fichero .bashrc:

export PATH="~/.config/composer/vendor/bin:$PATH"

Si no queremos usar el instalador de Laravel, podemos usar solo composer:

composer create-project --prefer-dist laravel/laravel miproyecto

Actualizar instalador Laravel

composer global update laravel/installer

Sail

Si estamos en Linux y tenemos Docker instalado, Laravel proporciona una herramienta llamada Sail que permite crear un entorno de ejecución para Laravel:

curl -s https://laravel.build/example-app | bash

Podemos sustituir example-app por el nombre que queramos (será el directorio donde descargará Laravel).

Entramos en el directorio y ejecutamos:

./vendor/bin/sail up

Sail es una aplicación para usar Laravel con Docker de forma sencilla:

  • Servidor web en puerto 80
  • Servidor Redis en puerto 6379
  • Mailhog en puerto 1025 y 8025 (dashboard)
  • Servidor MySQL en puerto 3306
  • Meilisearch en puerto 7700
  • Selenium

Docker

Pendiente de rellenar con notas sobre la instalación de Laravel en un contenedor.

Composer

Si tenemos PHP y Composer instalados, podemos crear un proyecto Laravel con Composer:

composer create-project laravel/laravel example-app

Entramos en el directorio recién creado:

cd example-app

Arrancamos el servidor de desarrollo de Laravel:

php artisan serve

Tendremos disponible la aplicación desde http://localhost:8000

Crear un proyecto de Laravel

Hay dos formas de crear un nuevo proyecto en Laravel.

Utilizando Composer:

composer create-project laravel/laravel nombre-del-proyecto

Podemos indicar la versión de Laravel que queremos usar:

composer create-project laravel/laravel nombre-del-proyecto "10.*"

Para instalar la versión 10 de Laravel.

Utilizando el instalador de Laravel:

laravel new nombre-del-proyecto

El instalador de Laravel se instala también con Composer:

composer global require laravel/installer

Configuración del archivo .env

Dentro del directorio creado, copiamos el archivo .env.example a .env

cp .env.example .env

Si vamos a usar una base de datos distinta a SQLite, lo configuramos también en el fichero .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nombre_db
DB_USERNAME=usuario_db
DB_PASSWORD=contraseña_db

Genera la clave de la aplicación:

php artisan key:generate

Servidor de desarrollo

php artisan serve

Tendremos accesible la aplicación Laravel desde http://localhost:8000.

Estructura de directorios

Al crear un proyecto Laravel, se crearán los siguientes directorios:

  • app/: código de la aplicación. Modelos, controladores, comandos y el código personalizado.
  • bootstrap/: ficheros que Laravel necesita cada vez que se ejecuta.
  • database/: contiene las migraciones de base de datos (migrations), model factories y seeds. También se puede almacenar en él una base de datos SQLite.
  • config/: ficheros de configuración.
  • lang/: ficheros de idiomas.
  • public/: directorio al que apunta el servidor web cuando sirve la aplicación. Contiene index.php, que es el front-controller. También contiene todo lo que se sirve públicamente como imágenes, hojas de estilo, scripts de JavaScript…
  • resources/: vistas de Blade y otros assets.
  • routes/: contiene la definición de las rutas del proyecto
  • storage/: contiene logs, caché y otros ficheros generados por Laravel.
  • tests/: contiene tests automatizados.
  • vendor/: contiene las dependencias de Composer.

La carpeta app/Models se incluyó por primera vez en la versión 8

  • composer.json dependencias requeridas por nuestro proyecto.
  • En el fichero .env se definen las variables de entorno (este fichero debe figurar en el .gitignore para que no salga de nuestro entorno local).

Ejecución de Laravel

Todo inicia con un archivo index.php. En Laravel, todo lo que sea público, es decir, todo lo que se pueda acceder desde una petición desde un navegador web, está en la carpeta public. Ahí encontraremos el archivo index.php.

En este fichero se controla el tiempo de ejecución del script, se cargan automáticamente las definiciones de las clases que instalamos por medio de Composer (dentro de la carpeta vendor) y se carga el “kernel” que es el que recibe la petición del usuario / navegador, la gestiona y envía la respuesta asociada. El kernel está en el fichero app/Http/Kernel.php. A su vez, hereda de vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php.

En el kernel se inicia el enrutador (router) que es el encargado de enviar la petición hacia las rutas.

Las rutas se encuentran en routes/. Lo normal es que trabajemos con el fichero web.php.

La ruta que hay en web.php gestiona la vista principal. Las vistas están en resources/views/. Los ficheros con las vistas siguen la nomenclatura nombre_vista.blade.php. Las vistas contienen el HTML, lo que devuelve Laravel al navegador web.

Configuración

Servidor web

Configurar el servidor web para que sirva desde la carpeta public. Por ejemplo, en el caso de Nginx:

server {

    server_name localhost;
  
    index index.php index.html;
    root /var/www/html/mi-proyecto/public;

(...)

Permisos

El servidor web debe poder escribir en los directorios storage y bootstrap/cache

Configuración de variables de entorno

En un proyecto de Laravel tendremos dos ficheros:

  • .env: contiene las variables de entorno que usa Laravel. No se debe publicar.
  • .env.example: es el que sí compartiremos porque es la base de la configuración de las variables de entorno.
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
...

Por ejemplo, en /config/app.php se cargan algunas variables de entorno como APP_NAME , APP_ENV

Migraciones

Creación del esquema de las tablas..

Modelos

Por defecto, se guardan en el directorio app/Models.

Podemos crear un modelo apoyándonos en artisan:

php artisan make:model Usuario --migration

Esto creará la clase Usuario en app/Models/Usuario.php con el código:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
 
class Usuario extends Model
{
    use HasFactory;
}

Además, como hemos indicado que queremos generar una migración de la base de datos (opción --migratio), también tendremos un fichero AAAA_MM_DD_HHMMSS_create_usuarios_table en database/migrations/ con el código:

<?php
 
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
class CreateUsuariosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('usuarios', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('usuarios');
    }
}

Controladores

Laravel se basa en un patrón de arquitectura del software llamado MVC, de Modelo-Vista-Controlador. Centrándonos en aplicaciones web, mantiene separado el código PHP del HTML.

Un controlador se encarga de manejar la lógica del negocio (crear, actualizar, mostrar, eliminar, realizar filtrados, etc).

Los controladores se ubican en app/Http/Controllers

Para crear un nuevo controlador, podemos hacerlo desde cero o utilizar Artisan:

php artisan make:controller ProductController

Esto creará un fichero llamado ProductController.php en app/Http/Controllers/ con el siguiente contenido rellenado por Laravel:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class ProductController extends Controller {
 
}

Vamos añadiendo acciones (métodos) al controlador:

    // ....
    public function index() 
    {
        return "This is the list of products";
    }

Podemos relacionar las rutas con los controladores, en lugar de tener funciones anónimas:

Route::get("products", "ProductController@index")->name("products.index");

Hemos asociado la ruta /products con la acción index del controlador ProductController.

Haríamos el resto de acciones:

    // ...
    public function create() 
    {
        return "This is the form to create a product from controller";
    }
 
    public function store() 
    {
        return "Product stored";
    }
 
    public function show($product) 
    {
        return "Showing the product with ID {$product}";
    }
 
    public function edit($product) 
    {
        return "Showing the form to edit the product with id {$product}";
    }
 
    public function update($product) 
    {
    // ...
    }
 
    public function destroy($product) 
    {
    // ...
    }

Vistas

No es práctico devolver cadenas con el HTML directamente desde las rutas o controladores. Las vistas proporcionan una forma conveniente de organizar todo el HTML en ficheros separados. Las vistas separan el controlador / lógica de la aplicación de su presentación.

Se almacenan en resources/views/

Si, por organización, creamos las vistas en otros directorios dentro del “oficial”, para hacer referencia a ellas:

// ...
    return view('users.profile', $data);

Con esto indicamos que queremos el fichero profile.blade.app que está en resources/views/users/

El nombre de los ficheros con las vistas deben terminar en .blade.php.

Creación de vistas

Los ficheros con las vistas se almacenan en resources/views/. Podemos crear directorios dentro de ese directorio para organizar mejor nuestros ficheros. Por ejemplo resources/views/products/index.blade.php.

<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="utf-8">
        <title>Título</title>
    </head>
    <body>
        <h1>Listado de productos</h1>
 
        <div class="table-responsive">
            <table class="table table-striped">
                <thead class="thead-light">
                    <tr>
                        <th>ID</th>
                        <th>Title</th>
                        <th>Description</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>Soap</td>
                        <td>Best soap ever</td>
                    </tr>
                    <tr>
                        <td>2</td>
                        <td>Shampoo</td>
                        <td>Best shampoo ever</td>
                    </tr>
                </tbody>
            </table>
        <div>
    </body>
</html>

Llamando a las vistas

Tanto desde un controlador como desde una ruta, podemos llamar a las vistas mediante el helper view:

Route::get("/", function() {
    return view("welcome");
})->name("main");

En caso de un controlador:

    // ...
    public function index() 
    {
        return view("index");
    }

Si la vista index.blade.php está dentro de una carpeta llamada “products”:

    // ...
    public function index() 
    {
        return view("products.index");
    }

Motor de plantillas Blade

Identificación y gestión de errores

Laravel utiliza un componente llamando Ignition, una página de error para aplicaciones Laravel.

Además de ver el error, podremos ver la traza hasta llegar a dicho error.

Las excepciones son controladas desde app/Exceptions/Handler.php.

Depurando con Laravel

Hay un par de helpers que nos ayudan a la hora de depurar errores en Laravel:

  • dd(): dump and die, muestra la información y detiene el script.
  • dump(): muestra la información, pero no detiene el script.

Por ejemplo, queremos saber el valor de cierta variable sin detener el script:

dump($variable);

Hecho con Laravel

Proyectos open source hechos con este framework:

Artisan

Interfaz en línea de comandos incluida en Laravel diseñada para automatizar tareas comunes en el desarrollo de aplicaciones. Se usa para generar código, gestionar la base de datos, ejecutar pruebas y más.

Podremos ver todos los comandos que admite Artisan y una breve descripción de cada uno mediante:

php artisan

Comandos de configuración

Iniciar un servidor local de desarrollo

php artisan serve

Desde ese momento, tendremos accesible nuestro proyecto desde http://localhost:8080

Podemos modificar el puerto utilizando el argumento --port:

php artisan serve --port=8000

Generar clave de aplicación

Una de las variables que están definidas en el fichero .env es APP_KEY. Para generar un valor aleatorio:

php artisan key:generate

Generación de código

Modelos

Para crear un nuevo modelo Eloquent:

php artisan make:model <NOMBRE_MODELO>

Si queremos que también genere la migración, le pasamos el argumento -m:

php artisan make:model <NOMBRE_MODELO> -m

También podemos generar de todo para un modelo:

php artisan make:model <NOMBRE_MODELO> -a

El comando anterior generará:

  • Model (app/Models/)
  • Migración (database/migrations/)
  • Seeder (database/seeders/)
  • Controlador y su recurso (7 rutas / métodos) para realizar un CRUD.
  • Factory (database/factories)
  • Policy

Controladores

Para generar un controlador:

php artisan make:controller <NOMBRE_CONTROLADOR>

Si también queremos que se creen los métodos RESTful (para listar, editar, añadir y borrar), le pasamos la opción --resource:

php artisan make:controller <NOMBRE_CONTROLADOR> --resource

Si queremos crear un controlador y asociarlo a un modelo, utilizamos la opción --model:

php artisan make:controller <NOMBRE_CONTROLADOR> --model=<NOMBRE_MODELO>

Gestión de la base de datos

Ejecutar migraciones pendientes

php artisan migrate

Revertir la última migración

php artisan migrate:rollback

Eliminar todas las tablas y ejecutar de nuevo las migraciones

php artisan migrate:fresh

Si también queremos que se ejecuten los seeders:

php artisan migrate:fresh --seed

Ejecutar seeders

php artisan db:seed

Si solo queremos que se ejecute cierto seeder, utilizamos la opción --class:

php artisan db:seed --class=UserSeeder

Gestión de rutas

Listar rutas registradas

php artisan route:list

Tinker: para pruebas

Para abrir la consola interactiva:

php artisan tinker

Borrar caché (por si hemos hecho muchos cambios y tenemos algún problema):

php artisan optimize:clear

Los comandos de Artisan que más usaremos serán los relacionados con migraciones de la base de datos y creación de componentes.

Ayuda

Para mostrar la ayuda de cualquier comando de artisan hay que añadir --help. Por ejemplo:

php artisan make:model --help

Información

Para mostrar la información de un modelo:

php artisan model:show <NOMBRE_MODELO>

Por ejemplo:

$ php artisan model:show User

App\Models\User

  Table: users
  Connection: mysql
  Primary key: id
  Incrementing: Yes
  With: []
  WithCount: []
  Belongs to Many: []

  Attributes:
    id: int (auto-increment)
    name: string
    email: string
    meta: array (cast)
    created_at: Illuminate\Support\Carbon (cast: datetime)
    updated_at: Illuminate\Support\Carbon (cast: datetime)

  Relationships:
    posts(): HasMany(App\Models\Post)
      🔑 Foreign key: user_id
      🗝️ Owner key: id

  Methods:
    getEmailVerifiedAtAttribute()
    setPasswordAttribute($value)

Servidor web de desarrollo

php artisan serve

Si queremos poner la aplicación en modo mantenimiento:

php artisan down

Esto hará que Laravel devuelva un error 503. Útil si queremos hacer modificaciones y evitar que los usuarios se muevan por donde no deben

Si queremos “reactivarla” o sacarla del modo de mantenimiento:

php artisan up

tinker: Interactuar con nuestra aplicación

Tinker es una consola de comandos con la que podremos interactuar con todas las clases y métodos de nuestra aplicación, una herramienta muy útil a la hora de realizar pruebas de funcionamiento.

php artisan tinker

A partir de ahí se abrirá una shell donde podremos ejecutar código PHP y funciones de Laravel. Por ejemplo, podemos usar los helpers de Laravel:

>>> \Str::plural('apple');
=> "people"
>>> \Str::random(5);
=> "IgRFW"

Generar variables de entorno

Si necesitamos generar la variable APP_KEY:

php artisan key:generate

Artisan añadirá al fichero .env la variable APP_KEY con un valor.

Ecosistema Laravel

  • Laravel Mix: gestión de dependencias para front-end, los assets (JavaScript y CSS). Necesita Node.js.

Entorno de desarrollo

Servidor web

Para simplificar, se puede usar un pequeño servidor que viene con Laravel:

php artisan serve

IDE o editor de código

Recomendación de plugins para el editor Sublime Text 3:

  • Package Control: Necesario para instalar plugins o paquetes
  • AdvancedNewFile: Para crear nuevos archivos fácilmente
  • Blade Snippets: Para usar instrucciones de Blade en las vistas
  • Bootstrap 4x Autocomplete: Sugerir componentes de Bootstrap 4 en las vistas
  • DocBlockr: Crear bloques de comentarios fácilmente
  • Emmet: Autocompletar etiquetas de HTML
  • Laravel Blade AutoComplete: Autocomplete estructuras comunes en las vistas de Blade
  • Laravel Blade Highlighter: Resalta el código con colores adecuados en las vistas
  • Laravel Helper Completions: Sugerir el uso de helpers comunes en el código
  • PHP Companion: Útil para importar definiciones de clases
  • phpfmt: Útil para corregir el estilo del código PHP
  • SideBarEnhacements: Para agregar opciones adicionales en la barra lateral
  • SublimeCodeIntel: Para explorar y abrir fácilmente definiciones de clases y métodos en el proyecto
  • SublimeLinter: Útil para detectar errores de sintaxis en el código
  • SublimeLinter-php: El linter propio para detectar errores en código PHP

Recursos

informatica/programacion/php/frameworks/laravel.txt · Última modificación: por tempwin