composer php - example - Compositor classmap autoload no carga nuevos archivos en la carpeta
vendor composer (3)
Como ya se ha señalado este es el comportamiento correcto. Si desea que las nuevas clases se carguen automáticamente, debe usar la carga automática PSR-0 o PSR-4.
El tipo de carga automática de classmap especificado es composer.json se usa principalmente en proyectos heredados que no siguen a PSR-0 o PSR-4. Recientemente comencé a trabajar en un proyecto de este tipo y quise intentar ejecutar composer dump-autoload
comando composer dump-autoload
del composer dump-autoload
cuando se crea una nueva clase. Esto es realmente complicado sin incluir toda la fuente del compositor dentro del proyecto. Se me ocurrió esto solo para recordarle al desarrollador que necesitan volcar el mapa de clase:
$loader = include_once ''vendor/autoload.php'';
if ( ! $loader ) {
throw new Exception( ''vendor/autoload.php missing please run `composer install`'' );
}
spl_autoload_register(
function ( $class ) {
if ( ''A_Common_Class_Prefix'' === substr( $class, 0, 10 ) ) {
throw new Error( ''Class "'' . $class . ''"" not found please run `composer dump-autoload`'' );
}
},
true
);
Esto registra otro autocargador que se ejecuta después del autocargador del compositor, por lo que cualquier clase que el compositor no haya encontrado se le pasará. Si la clase coincide con un prefijo, se lanza una excepción que le recuerda al desarrollador que debe volver a volcar el cargador automático y actualizar el mapa de clase.
El siguiente problema: He definido un mapa de clase en mi composer.json:
"autoload": {
"classmap": [
"app/controllers",
"app/models",
"app/helper.php"
]
}
Sin embargo, cuando creo un nuevo archivo en la carpeta "controladores" o "modelos", no los cargaré y siempre tengo que hacer un autocar de volcado de compositor.
¿Es este el comportamiento correcto? ¿Pensé que el autoloader del compositor monitorea la carpeta en busca de nuevos archivos?
Sí, este es el comportamiento correcto. Si desea que las nuevas clases se carguen automáticamente, debe usar la carga automática PSR-0 o PSR-4.
La generación del mapa de clase requiere que Composer sepa el nombre de archivo que contiene una determinada clase. Esto solo puede hacerse analizando todo el código fuente en el directorio y buscando clases, interfaces y definiciones de rasgos.
Por lo general, esta es una tarea intensiva de E / S y CPU, por lo que solo se realiza cuando Composer realiza la instalación / actualización o (a petición) vuelca el autocargador, no se realiza con cada require "vendor/autoload.php";
.
Tenga en cuenta que la carga automática del mapa de clase simplemente está ahí para las bases de código antiguas que no implementaron al menos el PSR-0. No está diseñado para un nuevo código, a menos que desee pagar el precio para descargar el autocargador una y otra vez durante el desarrollo.
Vaya a la raíz de su servidor por SSH. Ahora haz lo siguiente:
- Ejecute
ls
para listar todos los archivos. - Verás el archivo
composer.lock
; eliminar el archivo con el comandorm composer.lock
. - Ahora ejecute el comando
php composer update
.
Dependiendo de su tipo de linux, es posible que tenga que ejecutar la php-cli composer update
.
El paso 3 creará un nuevo archivo composer.lock
y todas tus clases se cargarán nuevamente. Haga esto cada vez que agregue nuevas clases.
o:
- Ejecute el comando
composer dump-autoload
.