Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Composer»
(Página creada con «https://es.wikieducator.org/Usuario:ManuelRomero/PHP/autoload») |
|||
| Línea 1: | Línea 1: | ||
| − | https://es.wikieducator.org/Usuario:ManuelRomero/PHP/autoload | + | <!--https://es.wikieducator.org/Usuario:ManuelRomero/PHP/autoload--> |
| + | <div id=seccion> | ||
| + | https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa | ||
| + | ===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 | ||
| + | <source lang=php> | ||
| + | spl_autoload_register(function ($clase)){ | ||
| + | require("Clases/$clase.php"); | ||
| + | } | ||
| + | </source> | ||
| + | *Esto también lo podríamos poner escrbiendo la función nominada | ||
| + | <source lang=php> | ||
| + | function autocarga($clase){ | ||
| + | require("Clases/$clase.php"); | ||
| + | } | ||
| + | |||
| + | spl_autoload_register(autocarga); | ||
| + | </source> | ||
| + | *O como lo venimos haciendo en las diferentes sesiones | ||
| + | <source lang=php> | ||
| + | $carga=fn($clase)=> require("Clases/$clase.php"); | ||
| + | spl_autoload_register(function ($carga)); | ||
| + | </source> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | *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. | ||
| + | |||
| + | {{MRM_Puntos_clave|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 | ||
| + | [[Archivo:directorios_autoload.png]] | ||
| + | ;En cada directorio creamos clases, para el ejemplo solo muestran un texto | ||
| + | <source lang=php> | ||
| + | <?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"; | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | *Esto para cada una de las clases. | ||
| + | ahora escribimos un fichero composer | ||
| + | <source lang=php> | ||
| + | { | ||
| + | "autoload": { | ||
| + | "classmap": [ | ||
| + | "Classes" | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | *a continuación actulizamos composer | ||
| + | <source lang=bash> | ||
| + | composer update | ||
| + | </source> | ||
| + | *Podemos ver cómo composer ha creado una estructura de carpetas donde ya tiene localizadas todas las clases del proyecto | ||
| + | [[Archivo:autoload_composer.png]]<br /> | ||
| + | *Y debemos incluir en nuestro proyecto el fichero autoload de composer | ||
| + | <soruce lang=php> | ||
| + | <?php | ||
| + | |||
| + | // autoload_classmap.php @generated by Composer | ||
| + | |||
| + | $vendorDir = dirname(dirname(__FILE__)); | ||
| + | $baseDir = dirname($vendorDir); | ||
| + | |||
| + | return array( | ||
| + | 'A' => $baseDir . '/Classes/A.php', | ||
| + | 'B' => $baseDir . '/Classes/B.php', | ||
| + | 'C' => $baseDir . '/Classes/class2/C.php', | ||
| + | 'D' => $baseDir . '/Classes/class3/D.php', | ||
| + | 'E' => $baseDir . '/Classes/class3/E.php', | ||
| + | ); | ||
| + | ?> | ||
| + | </source> | ||
| + | *Podemos ver el resultado | ||
| + | [[Archivo:ejercicios_autoload.png]] | ||
| + | Si añadimos nuevos ficheros necesitamos hacer | ||
| + | adding new files requires '''''composer dumpautoload''''' to regenerate the mapping. | ||
| + | ==Usando PSR4== | ||
| + | *https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ | ||
| + | |||
| + | ;Espacio de nombres | ||
| + | * https://diego.com.es/namespaces-en-php | ||
| + | * https://www.php.net/manual/es/language.namespaces.php | ||
| + | *El espacio de nombres o <span style=color:#A04000>namespace </span> 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) | ||
| + | <source lang=php> | ||
| + | /home/profesor/dwes/notas.ods | ||
| + | /home/profesor/bd/notas.ods | ||
| + | </source> | ||
| + | {{MRM_Resumen| | ||
| + | ;Los espacios de nombres de PHP permiten agrupar | ||
| + | clases, funciones, interfaces y constantes relacionadas. | ||
| + | }} | ||
| + | ;Declarar un namespace | ||
| + | *Debe de ser la primera instrucción del fichero (Cuidado incluso con espacios en blanco) | ||
| + | <source lang=php> | ||
| + | <?php | ||
| + | namespace MiProyecto; | ||
| + | .. | ||
| + | </source> | ||
| + | *El namespace puede tener varios niveles de jerarquía cuidado con la barra de separación '''''\''''' | ||
| + | <source lang=php> | ||
| + | <?php | ||
| + | namespace MiProyecto\nivel1\subnivel2; | ||
| + | ... | ||
| + | </source> | ||
| + | {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 | ||
| + | <source lang=php> | ||
| + | { | ||
| + | "autoload":{ | ||
| + | "psr-4":{ | ||
| + | "Nombre_Espacio\\":"Dir_donde_están_las_clases" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | "psr-4" | ||
| + | } | ||
| + | |||
| + | </source> | ||
| + | </div> | ||
Revisión de 11:04 14 mar 2023
https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa
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
<soruce lang=php> <?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir);
return array(
'A' => $baseDir . '/Classes/A.php', 'B' => $baseDir . '/Classes/B.php', 'C' => $baseDir . '/Classes/class2/C.php', 'D' => $baseDir . '/Classes/class3/D.php', 'E' => $baseDir . '/Classes/class3/E.php',
); ?> </source>
- 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" }

