php - with - instalar composer json
Usando Autoload de Composer (6)
Cada paquete debe ser responsable de la autocarga, ¿qué intenta lograr con las clases de carga automática que están fuera del paquete que define?
Una solución alternativa si es para su aplicación en sí es agregar un espacio de nombre a la instancia del cargador, algo como esto:
<?php
$loader = require ''vendor/autoload.php'';
$loader->add(''AppName'', __DIR__.''/../src/'');
He estado mirando la red sin suerte en este tema. Estoy usando autoload del compositor con este código en mi composer.json
:
"autoload": {
"psr-0": {"AppName": "src/"}
}
Pero necesito cargar automáticamente en un nivel más alto que la carpeta del vendedor.
Hacer algo como esto no funciona:
"autoload": {
"psr-0": {"AppName": "../src/"}
}
¿Alguien sabe una solución o cómo puedo hacer esto?
En mi opinión, Sergiy''s respuesta Sergiy''s debería ser la respuesta seleccionada para la pregunta dada. Estoy compartiendo mi entendimiento.
Estaba buscando cargar automáticamente mis archivos de paquete utilizando el compositor, que tengo en la estructura de directorios que figura a continuación.
<web-root>
|--------src/
| |--------App/
| |
| |--------Test/
|
|---------library/
|
|---------vendor/
| |
| |---------composer/
| | |---------autoload_psr4.php
| |
| |----------autoload.php
|
|-----------composer.json
|
Estoy usando la especificación de carga automática psr-4 .
Tuve que agregar líneas debajo del compositor del proyecto. Json. Tengo la intención de colocar mis archivos de clase dentro de src / App, src / Test y el directorio de la biblioteca.
"autoload": {
"psr-4": {
"OrgName//AppType//AppName//": ["src/App", "src/Test", "library/"]
}
}
Esto es bastante auto explicativo. OrgName / AppType / AppName es mi prefijo de espacio de nombres deseado. por ejemplo, para el usuario de la clase en src / App / Controller / Provider / User.php -
namespace OrgName/AppType/AppName/Controller/Provider; // namespace declaration
use OrgName/AppType/AppName/Controller/Provider/User; // when using the class
También tenga en cuenta que "src / App", "src / Test" ... son de su raíz web, que es donde está su composer.json. Nada que ver con el directorio del vendedor. echa un vistazo a vendor / autoload.php
Ahora si el compositor está instalado correctamente, todo lo que se requiere es #composer update
Después de la actualización del compositor, mis clases se cargaron correctamente. Lo que observé es que el compositor está agregando una línea en el proveedor / compositor / autoload_psr4.php
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
''Monolog//' => array($vendorDir . ''/monolog/monolog/src/Monolog''),
''OrgName//AppType//AppName//' => array($baseDir . ''/src/App'', $baseDir . ''/src/Test'', $baseDir . ''/library''),
);
Así es como se mapea el compositor. Para psr-0 mapping está en vendor / composer / autoload_classmap.php
La documentación del compositor establece que:
Después de agregar el campo de carga automática, debe volver a ejecutar la instalación para volver a generar el archivo proveedor / autoload.php.
Suponiendo que su "src" dir reside en el mismo nivel que el "vendedor" dir:
- src
- Nombre de la aplicación
- vendedor
- composer.json
la siguiente configuración es absolutamente correcta:
{
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
pero debe volver a actualizar / instalar las dependencias para que funcione, es decir, ejecute:
php composer.phar update
Este comando actualizará el archivo "vendedor / compositor / autoload_namespaces.php" para que coincida con su configuración.
La configuración de autocarga se inicia debajo del directorio de proveedor. Por lo tanto, es posible que desee cambiar el directorio del proveedor, por ejemplo
{
"config": {
"vendor-dir": "../vendor/"
},
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
¿O no es esto posible en tu proyecto?
Simplemente crea un enlace simbólico en tu carpeta src para el espacio de nombres que apunta a la carpeta que contiene tus clases ...
ln -s ../src/AppName ./src/AppName
Su autocarga en el compositor se verá igual ...
"autoload": {
"psr-0": {"AppName": "src/"}
}
Y las clases de espacio de nombres de AppName iniciarán un directorio desde su directorio de trabajo actual en una carpeta src
ahora ... eso debería funcionar.
También hay otras formas de usar las funciones de autocarga del compositor. Formas que pueden ser útiles para cargar paquetes sin espacios de nombres o paquetes que vienen con una función de autocarga personalizada.
Por ejemplo, si también desea incluir un solo archivo que contenga una función de autocarga, puede usar la directiva "archivos" de la siguiente manera:
"autoload": {
"psr-0": {
"": "src/",
"SymfonyStandard": "app/"
},
"files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},
Y dentro del archivo Swagger.php
tenemos:
function swagger_autoloader($className) {
$currentDir = dirname(__FILE__);
if (file_exists($currentDir . ''/'' . $className . ''.php'')) {
include $currentDir . ''/'' . $className . ''.php'';
} elseif (file_exists($currentDir . ''/models/'' . $className . ''.php'')) {
include $currentDir . ''/models/'' . $className . ''.php'';
}
}
spl_autoload_register(''swagger_autoloader'');
https://getcomposer.org/doc/04-schema.md#files
De lo contrario, puede usar una referencia de mapa de clase:
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
https://getcomposer.org/doc/04-schema.md#classmap
Nota: durante sus pruebas, recuerde iniciar el comando dump-autoload
del compositor o no verá ningún cambio.
./composer.phar dump-autoload
Feliz carga automática =)