Framework PHP
Las notas que aquí se recogen están centradas en la versión 9 de Laravel
Para que Laravel funcione correctamente, el servidor web que lo correrá debe tener la siguiente versión de PHP y extensiones:
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.
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:
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
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/routes/: contiene la definición de las rutas del proyectostorage/: 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..env se definen las variables de entorno (este fichero debe figurar en el .gitignore para que no salga de nuestro entorno local).
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.
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;
(...)
El servidor web debe poder escribir en los directorios storage y bootstrap/cache
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…
Creación del esquema de las tablas..
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, 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'); } }
Laravel se basa en un patrón de diseño 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) { // ... }
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.
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>
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"); }
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.
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);
Proyectos open source hechos con este framework:
Interfaz en línea de comandos incluida en Laravel.
Podremos ver todos los comandos que admite Artisan y una breve descripción de cada uno mediante:
php artisan
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.
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 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"
Si necesitamos generar la variable APP_KEY:
php artisan key:generate
Artisan añadirá al fichero .env la variable APP_KEY con un valor.
Para simplificar, se puede usar un pequeño servidor que viene con Laravel:
php artisan serve
Recomendación de plugins para el editor Sublime Text 3: