Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Composer»
(→Composer) |
(→Composer) |
||
| Línea 5: | Línea 5: | ||
==Composer== | ==Composer== | ||
<br /> | <br /> | ||
| − | {{MRM_Definicion|Title= | + | {{MRM_Definicion|Title=Qué es composer| |
| − | + | Lo mismo que un ''''director de orquesta''''', organiza y dirige todos los instrumentos para que la música suene de forma armoniosa, '''''composer''''' va a ser '''''un orquestador''''' que gestionará todos '''''los paquetes y librerías''''' necesarias para que mi proyecto pueda funcionar correctamente como una unidad | |
}} | }} | ||
| + | {{MRM_Definicion|Title=Qué hace composer| | ||
| + | Entre otras acciones, ¡¡¡¡¡composer me va a permitir¡¡¡¡¡: | ||
| + | *Gestionar de forma automática '''''la autocarga de los ficheros''''' que implementan las clases que utilizo | ||
| + | *'''''Instalar librerías y paquetes''''' de terceros para incorporar a mis proyectos | ||
| + | }} | ||
Revisión de 06:50 24 may 2023
https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa
Composer
|
Lo mismo que un 'director de orquesta, organiza y dirige todos los instrumentos para que la música suene de forma armoniosa, composer va a ser un orquestador que gestionará todos los paquetes y librerías necesarias para que mi proyecto pueda funcionar correctamente como una unidad |
Entre otras acciones, ¡¡¡¡¡composer me va a permitir¡¡¡¡¡:
|
Carga automática de clases
- Para cargar de forma automática las clases ya hemos visto como realizar un autoload de cada clase que necesitemos.
- Para ello escribimos el código en la función anónima que recibe en callback como argumento la función
spl_autload_register.
- Suponiendo que las clases las tenemos en el directorio Classes del proyecto
spl_autoload_register(function ($clase)){ require("Clases/$clase.php"); }
- Esto también lo podríamos poner escrbiendo la función nominada
function autocarga($clase){ require("Clases/$clase.php"); } spl_autoload_register(autocarga);
- O como lo venimos haciendo en las diferentes sesiones
$carga=fn($clase)=> require("Clases/$clase.php"); spl_autoload_register(function ($carga));
- Esto está bien, y hace que sólo estén cargados los ficheros que necesitemos en un momento dado
Puedes comprobar los ficheros cargados en un momento dado invocando a la función get_included_files() que te devuelve un array con todos los ficheros cargados. Este método presenta el inconveniente que o bien tienes todas las clases implementadas en un mismo directorio, o bien en la función de autocarga busca en directorios según el nombre de la clase, lo cual puede ser muy incómodo y poco productivo.
- Estaría bien un software que le podamos decir en un fichero dónde se ubican cada clase de nuestro proyecto, y que luego se pueda cargar automáticamente el fichero cuando sea necesario disponer de él
- Para este comentidoo podemos usar ello vamos a usar composer que tiene diferentes opciones que pueden satisfacer esta necesidad. Analizaremos dos de ellas classmap y PSR-4.
Por supuesto, siguiendo las buenas prácricas de programación, seguimos escribiendo cada clase en un fichero con el mismo nombre de la clase que implementa.
|
Cada clase está en un fichero que contiene el mismo nombre que la clase Sólo una clase por fichero
|
Composer es lo que se conoce como un orquestador, es decir un software que va a permitir que mi aplicación (la orquesta) funcione bien usando diferentes ficheros y diferentes librerías (los instrumentos de la orquesta). Composer se va a encargar de buscar los ficheros y librerías necesarias con la versión correspondiente para que todo funcione correctamente. Por supuesto, todo lo que necesitamos lo tendremos que especificar en un fichero. Este fichero se llama composer.json'
- Vemos como composer' realiza todo lo que necesitamos
- Veamos el ejemplo.
- Creamos una estructura de directorios
- En cada directorio creamos clases, para el ejemplo solo muestran un texto
<?php /** * Created by PhpStorm. * User: manuel * Date: 25/01/19 * Time: 17:54 */ class B { public function __toString() { // TODO: Implement __toString() method. return "Hola desde la clase B"; } }
- Esto para cada una de las clases.
ahora escribimos un fichero composer
{ "autoload": { "classmap": [ "Classes" ] } }
- a continuación actulizamos composer
composer update
- Podemos ver cómo composer ha creado una estructura de carpetas donde ya tiene localizadas todas las clases del proyecto
- Y debemos incluir en nuestro proyecto el fichero autoload de composer
<?php require "vendor/autoload.php"; ?>
- Podemos ver el resultado
Si añadimos nuevos ficheros necesitamos hacer
adding new files requires composer dumpautoload to regenerate the mapping.
Usando PSR4
- Espacio de nombres
- https://diego.com.es/namespaces-en-php
- https://www.php.net/manual/es/language.namespaces.php
- El espacio de nombres o namespace es una forma de organizar las clases evitando conflictos (permitir dos clases diferentes con el mismo nombre) y mejorar la estructura del proyecto
- Es una forma de agrupar clases lo mismo que un directorio agrupa todo su contenido y los permite localizarlo
- De hecho es el mismo concepto, de esta forma no tendremos ningún problema en tener dos ficheros con el mismo nombre (en diferente directorio)
/home/profesor/dwes/notas.ods /home/profesor/bd/notas.ods
clases, funciones, interfaces y constantes relacionadas. |
- Declarar un namespace
- Debe de ser la primera instrucción del fichero (Cuidado incluso con espacios en blanco)
<?php namespace MiProyecto; ..
- El namespace puede tener varios niveles de jerarquía cuidado con la barra de separación \
<?php namespace MiProyecto\nivel1\subnivel2; ...
{MRM_Resumen|Title=Algunos comentarios|
- Cada namespace referencia a una ubicación en un directorio
- No tiene por qué coincidir el namespace con el nombre de directorio, pero suele ser una buena práctica
}
- Una alternativa más interesante que classmap va a ser psr4.
- Con ella conseguimos no tener que volver a invocar a composer, cada vez que añadamos nuevas clases
- Hace la ejecución mucho más rápida, aunque al principio da la impresión de mas engorroso y menos sencillez.
- psr-4, está basado en el nombre de espacios o namespace
namespace
- Es una forma de organizar nuestras clases. para que podamos usar incluso clases con el mismo nombre (cada una de ellas que tenga un nombre de espacio diferente
- para ello ponemos en una clase un nombre al principio de la clase
- Todas las clases de ese directorio pertenecerán la mismo namespace
- Con ella no vamos a tener que regenerar el composer cada vez que añadamos una clase
- Añadimos en composer.json
{ "autoload":{ "psr-4":{ "Nombre_Espacio\\":"Dir_donde_están_las_clases" } } } "psr-4" }

