Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/autoload»

De WikiEducator
Saltar a: navegación, buscar
Línea 79: Línea 79:
 
Si añadimos nuevos ficheros necesitamos hacer
 
Si añadimos nuevos ficheros necesitamos hacer
 
  adding new files requires '''''composer dumpautoload''''' to regenerate the mapping.
 
  adding new files requires '''''composer dumpautoload''''' to regenerate the mapping.
 +
==Usando PSR4==
 +
*Una alternativa más interesanto que classmap va a ser psr4.
 +
*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_XXX//":"Dir_donde_están_las_clases"
 +
      }
 +
    }
 +
}
 +
 +
"psr-4"
 +
}
 +
 +
</source>

Revisión de 11:41 27 ene 2019

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

Para cargar de forma automática las clases se usa la función autload implementado la función anónima que recibe en callback como argumento.

spl_autoload_register(function ($clase)){
  require($clase);
 
}
  • Esto está bien, pero para ello deberían de estar todas las clases en el mismo directorio
  • Lo que pretendo es no depender de en qué subdirectorio esté del proyecto.
  • Para ello vamos a usar composer y PSR-4.

Por supuesto, siguiendo las buenas prácricas de programación



Icon key points.gif

Puntos clave

Cada clase está en un fichero que contiene el mismo nombre que la clase Sólo una clase por fichero


  • Vemos como composer realiza todo lo que necesitamos
  • Veamos el ejemplo.
Creamos una estructura de directorios

Directorios autoload.png

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

Autoload composer.png

  • 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

Ejercicios autoload.png Si añadimos nuevos ficheros necesitamos hacer

adding new files requires composer dumpautoload to regenerate the mapping.

Usando PSR4

  • Una alternativa más interesanto que classmap va a ser psr4.
  • 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_XXX//":"Dir_donde_están_las_clases"
      }
    }
}
 
"psr-4"
}