Pergunta

Estou trabalhando em um aplicativo que se conectará à API do Intuit Quickbooks por meio do SDK REST PHP deles.No PHP básico tenho tudo funcionando sem problemas já que carrego arquivos da seguinte forma:

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');

Agora preciso usar as bibliotecas do controlador Symfony2 a partir de um Bundle e é daí que vem minha dúvida, como posso conseguir isso facilmente?Eu li muitos documentos link1, Componente do carregador de classes Symfony e alguns outros, mas ainda não está claro para mim.Por enquanto eu criei essa estrutura no meu /vendor pasta como mostra a imagem:

vendor structure

O config.php arquivo que o seu pode ver tem 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');

E é aí que está a mágica do carregamento de classe, pelo menos para o modo QBO PHP SDK, então:

  • Como devo lidar com isso para usar a classe como Symfony2, quero dizer, criar objetos e assim por diante?
  • Como esta não é uma biblioteca PSR-0, o Symfony Class Loader Component será a solução?
  • Você poderia me dar algumas idéias ou até mesmo algum código para me ajudar a fazer isso funcionar?
Foi útil?

Solução

Symfony usa o Composer.Portanto, a maneira mais simples de incluir seu SDK é torná-lo compatível com o Composer, de uma forma ou de outra.

Isto exigirá um composer.json na raiz do pacote.Crie-o.

Solução mais simples

Coloque uma instrução de mapa de classe no seu composer.jsonde autoload seção :

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

O Composer irá então escanear recursivamente o src/ diretório ao gerar os arquivos de carregamento automático.E assim cada classe será importada quando necessário, sem alterar os namespaces nem nada.

A desvantagem é que a biblioteca ainda não segue o PSR0, com todos os riscos incluídos.

Solução trabalhosa

PSR0-ify a biblioteca editando cada arquivo de origem para adicionar o direito namespace e use instruções no topo de cada arquivo.É simples, mas trabalhoso dada a quantidade de classes do SDK.

Você pode então adicionar o autoload seção do pacote composer.json, assim :

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

Solução alternativa

Ao pesquisar por esta API, encontrei consolidbyte/quickbooks-php isso no packagist… talvez valha a pena tentar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top