/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"
===== Instalación =====
==== Instalador 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.
export PATH="~/.config/composer/vendor/bin:$PATH"
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
[[https://laravel.com/docs/8.x/sail|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 ====
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
composer create-project laravel/laravel nombre-del-proyecto "10.*"
Para instalar la versión 10 de Laravel.
laravel new nombre-del-proyecto
composer global require laravel/installer
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.
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:
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:
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.
{{ :informatica:programacion:mvc-programming.jpg?nolink |}}
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:
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 [[https://www.php.net/manual/es/functions.anonymous.php|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''.
* [[https://laravel.com/docs/10.x/views|Laravel Views]]
==== 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''.
Título
Listado de productos
ID
Title
Description
1
Soap
Best soap ever
2
Shampoo
Best shampoo ever
==== 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 **[[https://github.com/spatie/laravel-ignition|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:
* [[https://github.com/firefly-iii/firefly-iii|Firefly III]]: gestor de finanzas personales
* [[https://github.com/monicahq/monica|Monica]]: Gestor de relaciones personales.
* [[https://github.com/snipe/snipe-it|Snipe-IT]]: Gestor de recursos y licencias TI
* https://gist.github.com/msurguy/8590765
* [[https://github.com/fgitpush/Top-Laravel-Interview-Questions-Wiki|Top Laravel Interview Questions & Answers]]
===== 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 [[informatica:programacion:php:frameworks:laravel:eloquent_orm|Eloquent]]:
php artisan make:model
Si queremos que también genere la migración, le pasamos el argumento ''-m'':
php artisan make:model -m
También podemos generar de todo para un modelo:
php artisan make:model -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
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 --resource
Si queremos crear un controlador y asociarlo a un modelo, utilizamos la opción ''%%--model%%'':
php artisan make:controller --model=
==== 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
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 //[[https://laravel.com/docs/10.x/helpers|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 =====
* [[https://laravel-mix.com/|Laravel Mix]]: gestión de dependencias para front-end, los assets (JavaScript y CSS). Necesita [[https://nodejs.org/en|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 =====
* [[https://github.com/chiraggude/awesome-laravel|Awesome Laravel]]: A curated list of awesome bookmarks, packages, tutorials, videos and other cool resources from the Laravel ecosystem.
* [[https://laravel.com/docs/10.x|Documentación de Laravel]]