Il modo giusto per utilizzare librerie esterne non PSR-0 sul progetto Symfony2
-
21-12-2019 - |
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:
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?
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.