Pregunta

Estoy trabajando en una aplicación que se conectará a la API de Intuit Quickbooks a través de su REST PHP SDK.En PHP básico tengo las cosas funcionando sin problema ya que cargo los archivos de la siguiente manera:

require_once('../api/config.php');  // Default V3 PHP SDK (v2.0.1) from IPP
require_once(PATH_SDK_ROOT . 'Core/ServiceContext.php');
require_once(PATH_SDK_ROOT . 'DataService/DataService.php');
require_once(PATH_SDK_ROOT . 'PlatformService/PlatformService.php');
require_once(PATH_SDK_ROOT . 'Utility/Configuration/ConfigurationManager.php');

Ahora necesito usar las librerías en el controlador Symfony2 desde un Bundle y de ahí viene mi duda, ¿cómo puedo lograrlo fácilmente?leí muchos documentos enlace1, Componente cargador de clases Symfony y algunos otros pero ni siquiera me queda claro en absoluto.Por ahora he creado esta estructura en mi /vendor carpeta como muestra la imagen:

vendor structure

El config.php El archivo que el tuyo puede ver ahí tiene este código:

/**
 * This file allows custom configuration of paths for XSD2PHP dependencies and
 * POPO classes.  Rarely necessary, but possible.
 *
 * @author Intuit Partner Platform Team
 * @version 1.0
 */

// Determine parent path for SDK
$sdkDir = __DIR__ . DIRECTORY_SEPARATOR;

if (!defined('PATH_SDK_ROOT'))
    define('PATH_SDK_ROOT', $sdkDir);

// Specify POPO class path; typically a direct child of the SDK path
if (!defined('POPO_CLASS_PATH'))
    define('POPO_CLASS_PATH', $sdkDir . 'Data');

// Include XSD2PHP dependencies for marshalling and unmarshalling
use com\mikebevz\xsd2php;
require_once(PATH_SDK_ROOT . 'Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Php2Xml.php');
require_once(PATH_SDK_ROOT . 'Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Bind.php');

// Includes all POPO classes; these are the source, dest, or both of the marshalling
set_include_path(get_include_path() . PATH_SEPARATOR . POPO_CLASS_PATH);
foreach (glob(POPO_CLASS_PATH.'/*.php') as $filename)
    require_once($filename);

// Specify the prefix pre-pended to POPO class names.  If you modify this value, you
// also need to rebuild the POPO classes, with the same prefix
if (!defined('PHP_CLASS_PREFIX'))
    define('PHP_CLASS_PREFIX',    'IPP');

Y ahí es donde está la magia de carga de clases, al menos para la forma QBO PHP SDK, así que:

  • ¿Cómo debo lidiar con esto para poder usar la clase como Symfony2? ¿Me refiero a crear objetos, etc.?
  • Dado que esta no es una biblioteca PSR-0, ¿será el componente Symfony Class Loader la solución?
  • ¿Podrías darme algunas ideas o incluso algún código para ayudarme a que esto funcione?
¿Fue útil?

Solución

Symfony utiliza el compositor.Entonces, la forma más sencilla de incluir su SDK es hacerlo aproximadamente compatible con Composer, de una forma u otra.

Esto requerirá un composer.json en la raíz del paquete.Créelo.

La solución más sencilla

Pon una instrucción de mapa de clase en tu composer.json's autoload sección :

"autoload": {
    "classmap": ['src/'],
},

Composer luego escaneará recursivamente el src/ directorio al generar los archivos de carga automática.Y así, cada clase se importará cuando sea necesario, sin cambiar los espacios de nombres ni nada.

La desventaja es que la biblioteca todavía no sigue PSR0, con todos los riesgos incluidos.

Solución laboriosa

PSR0-ify la biblioteca editando cada archivo fuente para agregar el derecho namespace y use instrucción en la parte superior de cada archivo.Es simple, pero laborioso dada la cantidad de clases que hay en el SDK.

Luego puedes agregar el autoload sección del paquete composer.json, como esto :

"autoload": {
    "psr-0": {
        "QBO\\": "src/"
    }
},

Solución alternativa

Al buscar esta API, encontré consolibyte/quickbooks-php Esto en Packagist... tal vez valga la pena intentarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top