Maneira correta de usar bibliotecas externas não PSR-0 no projeto Symfony2
-
21-12-2019 - |
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:
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?
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.json
de 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.