Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Composer»
| Línea 24: | Línea 24: | ||
* Mantiene un fichero de ''metainformación'' del proyecto en '''composer.json''', donde se define: | * Mantiene un fichero de ''metainformación'' del proyecto en '''composer.json''', donde se define: | ||
| − | + | <source lang=php> | |
| − | + | get_included_files() | |
| − | + | </source> | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | * | + | *Sería ideal tener un sistema que nos permitiera indicar dónde se encuentran las clases, generar automáticamente la autocarga y mantenerlo todo organizado.* |
| + | Para eso existe '''Composer''', que incorpora diferentes estrategias para el ''autoload'': '''classmap''' y '''PSR-4'''. | ||
| − | + | {{MRM_Puntos_clave| | |
| − | ** | + | *Cada clase en su propio fichero* |
| − | ** | + | *El fichero debe llamarse igual que la clase* |
| + | }} | ||
| − | + | ===Usando Composer con ''classmap''=== | |
| − | + | ||
| − | * | + | *Creamos una estructura de directorios, por ejemplo:* |
| + | [[Archivo:directorios_autoload.png]] | ||
| + | |||
| + | *Ejemplo de clase:* | ||
| + | <source lang=php> | ||
| + | <?php | ||
| + | class B { | ||
| + | public function __toString() { | ||
| + | return "Hola desde la clase B"; | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | *Creamos el fichero '''composer.json''' indicando que Composer debe escanear el directorio ''Clases/'':* | ||
| + | |||
| + | <source lang=php> | ||
| + | { | ||
| + | "autoload": { | ||
| + | "classmap": [ | ||
| + | "Clases" | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | *Actualizamos Composer para generar la carga automática:* | ||
| + | |||
| + | <source lang=bash> | ||
| + | composer update | ||
| + | </source> | ||
| + | |||
| + | *Composer crea automáticamente la carpeta '''vendor/''' y genera el fichero de autocarga.* | ||
| + | [[Archivo:autoload_composer.png]] | ||
| + | |||
| + | *Ahora sólo tenemos que incluir el autoload en nuestro proyecto:* | ||
| + | |||
| + | <source lang=php> | ||
| + | <?php | ||
| + | require "vendor/autoload.php"; | ||
| + | </source> | ||
| + | |||
| + | *Si añadimos nuevos ficheros, recuerda regenerar el autoload:* | ||
| + | |||
| + | <source lang=bash> | ||
| + | composer dumpautoload | ||
| + | </source> | ||
| + | |||
| + | --- | ||
| + | |||
| + | ==Usando PSR-4== | ||
| + | |||
| + | *PSR-4 es el método moderno y recomendado de autocarga. Usa los '''namespaces''' para localizar las clases automáticamente sin necesidad de regenerar el autoload cada vez.* | ||
| + | |||
| + | *Referencias recomendadas:* | ||
| + | https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ | ||
| + | https://diego.com.es/namespaces-en-php | ||
| + | https://www.php.net/manual/es/language.namespaces.php | ||
| + | |||
| + | ;Espacio de nombres | ||
| + | *Un '''namespace''' es una forma de organizar clases, funciones e interfaces evitando conflictos entre nombres.* | ||
| + | *Es equivalente a la organización en directorios del sistema de ficheros.* | ||
| + | |||
| + | Ejemplo equivalente en archivos reales: | ||
| + | |||
| + | <source lang=php> | ||
| + | /home/profesor/dwes/notas.ods | ||
| + | /home/profesor/bd/notas.ods | ||
| + | </source> | ||
| + | |||
| + | Puedes tener dos clases con el mismo nombre si pertenecen a distintos namespaces. | ||
| + | |||
| + | {{MRM_Resumen| | ||
| + | Los namespaces de PHP permiten agrupar clases, funciones, interfaces y constantes relacionadas. | ||
}} | }} | ||
| − | === | + | ===Declarar un namespace=== |
| − | * | + | *El namespace debe ser la primera línea del fichero (sin espacios previos).* |
| − | + | ||
| − | * | + | <source lang=php> |
| + | <?php | ||
| + | namespace MiProyecto; | ||
| + | </source> | ||
| + | |||
| + | *También puede tener varios niveles separados por barras invertidas ''\''':* | ||
<source lang=php> | <source lang=php> | ||
| − | + | <?php | |
| − | + | namespace MiProyecto\Nivel1\Subnivel2; | |
| − | + | ||
</source> | </source> | ||
| − | * | + | {{MRM_Resumen|Title=Comentarios sobre namespaces| |
| + | *Cada namespace suele corresponder a un directorio. | ||
| + | *No es obligatorio que coincidan exactamente, pero es buena práctica.* | ||
| + | }} | ||
| + | |||
| + | --- | ||
| + | |||
| + | ===PSR-4 en Composer=== | ||
| + | |||
| + | *PSR-4 es más potente y elegante que ''classmap'', y no requiere regenerar el autoload cuando se añaden nuevas clases.* | ||
| + | |||
| + | *Se basa completamente en los '''namespaces'''.* | ||
| + | |||
| + | Ejemplo de configuración en '''composer.json''': | ||
<source lang=php> | <source lang=php> | ||
| − | + | { | |
| − | + | "autoload": { | |
| + | "psr-4": { | ||
| + | "MiProyecto\\": "src/" | ||
| + | } | ||
| + | } | ||
} | } | ||
| − | |||
| − | |||
</source> | </source> | ||
| − | + | Esto significa: | |
| + | * Las clases con namespace **MiProyecto** se cargarán desde la carpeta **src/** | ||
| + | * La clase: | ||
<source lang=php> | <source lang=php> | ||
| − | + | namespace MiProyecto\Modelos; | |
| − | + | ||
</source> | </source> | ||
| − | * | + | se ubica en |
| + | <source lang=php> | ||
| + | src/Modelos/Usuario.php | ||
| + | </source> | ||
| + | |||
| + | *Tras crear o modificar el composer.json, sólo debes ejecutar:* | ||
| + | |||
| + | <source lang=bash> | ||
| + | composer dumpautoload | ||
| + | </source> | ||
| + | |||
| + | PSR-4 permite: | ||
| + | |||
| + | * Organizar clases por módulos y carpetas | ||
| + | * Crear proyectos escalables | ||
| + | * Evitar conflictos de nombres | ||
| + | * Mejorar la legibilidad y mantenibilidad del código | ||
| + | |||
| + | y es el estándar moderno utilizado por: | ||
| − | * | + | * Laravel |
| − | * | + | * Symfony |
| − | * | + | * CodeIgniter 4 |
| − | * | + | * Doctrine |
| + | * La mayoría del ecosistema PHP actual | ||
| − | + | </div> | |
Revisión de 20:33 16 nov 2025
Contenido
Composer
https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa
|
Del mismo modo que un director de orquesta coordina a todos los instrumentos para que la música suene de forma armoniosa, Composer actúa como un orquestador del proyecto PHP. Su función principal es gestionar de forma unificada todos los paquetes, librerías y dependencias que una aplicación necesita para funcionar correctamente. |
|
Entre sus funciones principales, Composer me permite:
|
{{MRM_Definicion|Title=Otras funcionalidades importantes de Composer| Además del autoload y la instalación de dependencias, Composer también:
- Mantiene un fichero de metainformación del proyecto en composer.json, donde se define:
get_included_files()
- Sería ideal tener un sistema que nos permitiera indicar dónde se encuentran las clases, generar automáticamente la autocarga y mantenerlo todo organizado.*
Para eso existe Composer, que incorpora diferentes estrategias para el autoload: classmap y PSR-4.
Usando Composer con classmap
- Creamos una estructura de directorios, por ejemplo:*
- Ejemplo de clase:*
<?php class B { public function __toString() { return "Hola desde la clase B"; } }
- Creamos el fichero composer.json indicando que Composer debe escanear el directorio Clases/:*
{ "autoload": { "classmap": [ "Clases" ] } }
- Actualizamos Composer para generar la carga automática:*
composer update
- Composer crea automáticamente la carpeta vendor/ y genera el fichero de autocarga.*
- Ahora sólo tenemos que incluir el autoload en nuestro proyecto:*
<?php require "vendor/autoload.php";
- Si añadimos nuevos ficheros, recuerda regenerar el autoload:*
composer dumpautoload
---
Usando PSR-4
- PSR-4 es el método moderno y recomendado de autocarga. Usa los namespaces para localizar las clases automáticamente sin necesidad de regenerar el autoload cada vez.*
- Referencias recomendadas:*
https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ https://diego.com.es/namespaces-en-php https://www.php.net/manual/es/language.namespaces.php
- Espacio de nombres
- Un namespace es una forma de organizar clases, funciones e interfaces evitando conflictos entre nombres.*
- Es equivalente a la organización en directorios del sistema de ficheros.*
Ejemplo equivalente en archivos reales:
/home/profesor/dwes/notas.ods /home/profesor/bd/notas.ods
Puedes tener dos clases con el mismo nombre si pertenecen a distintos namespaces.
|
Los namespaces de PHP permiten agrupar clases, funciones, interfaces y constantes relacionadas. |
Declarar un namespace
- El namespace debe ser la primera línea del fichero (sin espacios previos).*
<?php namespace MiProyecto;
- También puede tener varios niveles separados por barras invertidas \':*
<?php namespace MiProyecto\Nivel1\Subnivel2;
|
---
PSR-4 en Composer
- PSR-4 es más potente y elegante que classmap, y no requiere regenerar el autoload cuando se añaden nuevas clases.*
- Se basa completamente en los namespaces.*
Ejemplo de configuración en composer.json:
{ "autoload": { "psr-4": { "MiProyecto\\": "src/" } } }
Esto significa:
- Las clases con namespace **MiProyecto** se cargarán desde la carpeta **src/**
- La clase:
namespace MiProyecto\Modelos;
se ubica en
src/Modelos/Usuario.php
- Tras crear o modificar el composer.json, sólo debes ejecutar:*
composer dumpautoload
PSR-4 permite:
- Organizar clases por módulos y carpetas
- Crear proyectos escalables
- Evitar conflictos de nombres
- Mejorar la legibilidad y mantenibilidad del código
y es el estándar moderno utilizado por:
- Laravel
- Symfony
- CodeIgniter 4
- Doctrine
- La mayoría del ecosistema PHP actual

