Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Composer»

De WikiEducator
Saltar a: navegación, buscar
 
(3 revisiones intermedias por el mismo usuario no mostrado)
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:
** autor
+
<source lang=php>
** versión del proyecto
+
get_included_files()
** licencia
+
</source>
** dependencias y versiones compatibles
+
** scripts personalizados
+
** configuración del autoload
+
  
* Controla las versiones exactas instaladas mediante '''composer.lock''', garantizando que todo el equipo trabaja con las mismas librerías.
+
*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'''.
  
* Permite actualizar dependencias de forma controlada con comandos como:
+
{{MRM_Puntos_clave|
** <code>composer update</code>
+
*Cada clase en su propio fichero*
** <code>composer outdated</code>
+
*El fichero debe llamarse igual que la clase*
 +
}}
  
* Facilita compartir el proyecto con otros desarrolladores sin incluir las librerías, gracias a:
+
===Usando Composer con ''classmap''===
** <code>composer install</code>
+
  
* Permite usar paquetes creados por la comunidad a través de '''Packagist''', el repositorio central de Composer.
+
*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.
 
}}
 
}}
  
===Carga automática de clases===
+
===Declarar un namespace===
  
*Hasta ahora hemos visto cómo realizar una carga automática simple mediante la función '''spl_autoload_register()'''.
+
*El namespace debe ser la primera línea del fichero (sin espacios previos).*
Este método permite cargar clases automáticamente sólo cuando se necesitan, evitando múltiples ''include'' o ''require''.*
+
  
*Ejemplo: autocarga básica suponiendo que todas las clases están en el directorio '''Clases/'''*
+
<source lang=php>
 +
<?php
 +
namespace MiProyecto;
 +
</source>
 +
 
 +
*También puede tener varios niveles separados por barras invertidas ''\''':*
  
 
<source lang=php>
 
<source lang=php>
spl_autoload_register(function($clase){
+
<?php
    require "Clases/$clase.php";
+
namespace MiProyecto\Nivel1\Subnivel2;
});
+
 
</source>
 
</source>
  
*También podemos usar una función nominada:*
+
{{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>
function autocarga($clase){
+
{
     require "Clases/$clase.php";
+
  "autoload": {
 +
     "psr-4": {
 +
      "MiProyecto\\": "src/"
 +
    }
 +
  }
 
}
 
}
 +
</source>
  
spl_autoload_register('autocarga');
+
Esto significa:
 +
 
 +
* Las clases con namespace **MiProyecto** se cargarán desde la carpeta **src/**
 +
* La clase:
 +
<source lang=php>
 +
namespace MiProyecto\Modelos;
 
</source>
 
</source>
  
*O una función flecha:*
+
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 
 +
 
 +
 
 +
 
 +
 
 +
===Comparativa: ''classmap'' vs ''PSR-4''===
 +
 
 +
A la hora de configurar la carga automática de clases con Composer, existen dos métodos principales: '''classmap''' y '''PSR-4'''. 
 +
Ambos funcionan, pero sirven para necesidades diferentes.
 +
 
 +
{| class="wikitable"
 +
! Método
 +
! Cómo funciona
 +
! Ventajas
 +
! Inconvenientes
 +
|-
 +
|'''classmap'''
 +
|Composer escanea directorios y genera una lista interna (mapa) con todas las clases y su fichero correspondiente.
 +
|
 +
* Muy sencillo de configurar 
 +
* Funciona sin namespaces 
 +
* Útil para proyectos heredados
 +
|
 +
* No escala bien 
 +
* Requiere ejecutar <code>composer dumpautoload</code> o <code>composer update</code> al añadir nuevas clases 
 +
* No organiza la estructura del proyecto
 +
|-
 +
|'''PSR-4'''
 +
|La autocarga se basa en los namespaces: cada namespace corresponde a una carpeta. 
 +
Composer encuentra automáticamente las clases según su ruta.
 +
|
 +
* Estándar moderno y recomendado 
 +
* No requiere regenerar el autoload al añadir nuevas clases 
 +
* Organización clara y modular 
 +
* Muy usado en Laravel y frameworks modernos 
 +
* Facilita evitar conflictos de nombres
 +
|
 +
* Requiere usar namespaces 
 +
* Necesita estructura organizada desde el principio
 +
|}
 +
 
 +
===Ejemplo visual: cómo piensan los dos sistemas===
 +
 
 +
;Classmap (método antiguo o heredado)
 +
Composer crea un “mapa” con las rutas exactas.
  
 
<source lang=php>
 
<source lang=php>
$carga = fn($clase) => require "Clases/$clase.php";
+
{
spl_autoload_register($carga);
+
  "autoload": {
 +
    "classmap": ["Clases/"]
 +
  }
 +
}
 
</source>
 
</source>
  
*Este sistema funciona correctamente, pero presenta limitaciones:*
+
Resultado interno:
 +
<source lang=bash>
  
* Todas las clases deben estar en un mismo directorio **o**
+
B => Clases/B.php
* La función debe buscar en múltiples rutas según reglas que tú tengas que programar.
+
C => Clases/C.php
* No escala bien en proyectos grandes.
+
MiClaseEspecial => Clases/OtraCarpeta/MiClaseEspecial.php
* No organiza la estructura del proyecto.
+
</source>
 +
Cada vez que añades una clase nueva → 
 +
'''composer dumpautoload'''
 +
 
 +
---
 +
;PSR-4 (método moderno)
 +
Mapea namespaces a carpetas:
 +
 
 +
<source lang=php>
 +
{
 +
  "autoload": {
 +
    "psr-4": {
 +
      "MiProyecto\\": "src/"
 +
    }
 +
  }
 +
}
 +
</source>
 +
 
 +
Reglas:
 +
 
 +
<source lang=php>
 +
namespace MiProyecto\Modelos;
 +
 
 +
src/Modelos/Usuario.php
 +
</source>
  
Puedes ver los ficheros cargados en cada momento con:
+
Añades una clase → no hace falta hacer nada 
 +
(Composer la encontrará automáticamente).
 +
</div>
 +
</div>

Última revisión de 20:38 16 nov 2025

Composer

https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa



Icon define.gif
¿Qué es Composer?

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.




Icon define.gif
¿Qué hace Composer?

Entre sus funciones principales, Composer me permite:

  • Gestionar automáticamente la autocarga (autoload) de las clases, evitando tener que hacer includes o requires manuales.
  • Instalar librerías y paquetes de terceros dentro de mi proyecto de forma rápida, segura y organizada.


{{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.



Icon key points.gif

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:*

Directorios autoload.png

  • 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.*

Autoload composer.png

  • 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.


Icon summary.gif
Objetivo

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;


Icon summary.gif
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:

{
  "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



Comparativa: classmap vs PSR-4

A la hora de configurar la carga automática de clases con Composer, existen dos métodos principales: classmap y PSR-4. Ambos funcionan, pero sirven para necesidades diferentes.

Método Cómo funciona Ventajas Inconvenientes
classmap Composer escanea directorios y genera una lista interna (mapa) con todas las clases y su fichero correspondiente.
  • Muy sencillo de configurar
  • Funciona sin namespaces
  • Útil para proyectos heredados
  • No escala bien
  • Requiere ejecutar composer dumpautoload o composer update al añadir nuevas clases
  • No organiza la estructura del proyecto
PSR-4 La autocarga se basa en los namespaces: cada namespace corresponde a una carpeta.

Composer encuentra automáticamente las clases según su ruta.

  • Estándar moderno y recomendado
  • No requiere regenerar el autoload al añadir nuevas clases
  • Organización clara y modular
  • Muy usado en Laravel y frameworks modernos
  • Facilita evitar conflictos de nombres
  • Requiere usar namespaces
  • Necesita estructura organizada desde el principio

Ejemplo visual: cómo piensan los dos sistemas

Classmap (método antiguo o heredado)

Composer crea un “mapa” con las rutas exactas.

{
  "autoload": {
    "classmap": ["Clases/"]
  }
}

Resultado interno:

B => Clases/B.php
C => Clases/C.php
MiClaseEspecial => Clases/OtraCarpeta/MiClaseEspecial.php

Cada vez que añades una clase nueva → composer dumpautoload

---

PSR-4 (método moderno)

Mapea namespaces a carpetas:

{
  "autoload": {
    "psr-4": {
      "MiProyecto\\": "src/"
    }
  }
}

Reglas:

namespace MiProyecto\Modelos;
 
src/Modelos/Usuario.php

Añades una clase → no hace falta hacer nada (Composer la encontrará automáticamente).