Правильный способ использования внешних библиотек, отличных от PSR-0, в проекте Symfony2
-
21-12-2019 - |
Вопрос
Я работаю над приложением, которое будет подключаться к API Intuit Quickbooks через их REST PHP SDK.В базовом PHP у меня все работает без проблем, поскольку я загружаю файлы следующим образом:
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');
Теперь мне нужно использовать библиотеки в контроллере Symfony2 из пакета, и именно здесь у меня возникают сомнения, как я могу легко этого добиться?Я прочитал много документов ссылка1, Компонент загрузчика классов Symfony и некоторые другие, но даже мне вообще непонятно.На данный момент я создал эту структуру в своем /vendor
папка, как показано на изображении:
А config.php
файл, который вы видите, содержит этот код:
/**
* 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');
И здесь есть магия загрузки классов, по крайней мере, для QBO PHP SDK, поэтому:
- Как мне с этим справиться, чтобы использовать класс как Symfony2, я имею в виду создание объектов и так далее?
- Поскольку это не библиотека PSR-0, будет ли компонент Symfony Class Loader решением?
- Не могли бы вы дать мне несколько идей или даже код, который поможет мне заставить это работать?
Решение
Symfony использует Composer.Поэтому самый простой способ включить ваш SDK — это примерно сделать его совместимым с Composer тем или иным способом.
Это потребует composer.json
в корне пакета.Создать это.
Самое простое решение
Поместите инструкцию по карте классов в свой composer.json
's autoload
раздел :
"autoload": {
"classmap": ['src/'],
},
Затем Composer рекурсивно просканирует src/
каталог при создании файлов автозагрузки.Таким образом, каждый класс будет импортирован при необходимости без изменения пространств имен или чего-либо еще.
Обратной стороной является то, что библиотека по-прежнему не соответствует PSR0 со всеми рисками.
Трудоёмкое решение
PSR0-инициализировать библиотеку, отредактировав каждый исходный файл, добавив нужные namespace
и use
инструкцию поверх каждого файла.Это просто, но трудоемко, учитывая количество классов в SDK.
Затем вы можете добавить autoload
раздел упаковки composer.json
, так :
"autoload": {
"psr-0": {
"QBO\\": "src/"
}
},
Альтернативное решение
При поиске этого API я нашел consolibyte/quickbooks-php это на упаковке… возможно, стоит попробовать.