Правильный способ использования внешних библиотек, отличных от PSR-0, в проекте Symfony2

StackOverflow https://stackoverflow.com//questions/24041485

Вопрос

Я работаю над приложением, которое будет подключаться к 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 папка, как показано на изображении:

vendor structure

А 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 это на упаковке… возможно, стоит попробовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top