Domanda

Sto lavorando su un'applicazione che si connetterà all'API Intuit Quickbooks tramite il loro SDK REST PHP.In PHP di base le cose funzionano senza problemi poiché carico i file come segue:

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

Ora devo utilizzare le librerie nel controller Symfony2 da un bundle ed è qui che nasce il mio dubbio, come posso ottenerlo facilmente?Ho letto molti documenti collegamento1, Componente caricatore di classi di Symfony e alcuni altri, ma non mi è affatto chiaro.Per ora ho creato questa struttura nel mio /vendor cartella come mostra l'immagine:

vendor structure

IL config.php il file che il tuo può vedere lì ha questo codice:

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

Ed è qui che si trova la magia del caricamento delle classi, almeno per il modo QBO PHP SDK, quindi:

  • Come dovrei gestire questo per poter utilizzare la classe come Symfony2 intendo creare oggetti e così via?
  • Poiché questa non è una libreria PSR-0, il componente Symfony Class Loader sarà la soluzione?
  • Potresti darmi qualche idea o anche qualche codice per aiutarmi a farlo funzionare?
È stato utile?

Soluzione

Symfony usa Composer.Quindi il modo più semplice per includere il tuo SDK è renderlo approssimativamente compatibile con Composer, in un modo o nell'altro.

Ciò richiederà a composer.json nella root del pacchetto.Crealo.

Soluzione più semplice

Inserisci un'istruzione classmap nel tuo file composer.json'S autoload sezione :

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

Il compositore eseguirà quindi la scansione ricorsiva del file src/ directory durante la generazione dei file di caricamento automatico.E così ogni classe verrà importata quando necessario, senza modificare i namespace o altro.

Lo svantaggio è che la libreria continua a non seguire la PSR0, con tutti i rischi inclusi.

Soluzione laboriosa

PSR0-ify la libreria modificando ciascun file sorgente per aggiungere il diritto namespace E use istruzioni sopra ogni file.È semplice, ma laborioso dato il numero di classi nell'SDK.

È quindi possibile aggiungere il autoload sezione del pacchetto composer.json, come questo :

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

Soluzione alternativa

Durante la ricerca di questa API, ho trovato consolidabyte/quickbooks-php questo su packagist... forse vale la pena provarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top