我正在开发一个应用程序,该应用程序将通过其 REST PHP SDK 连接到 Intuit Quickbooks API。在基本 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');

现在我需要使用 Bundle 中的 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 类加载器组件会是解决方案吗?
  • 你能给我一些想法,甚至一些代码来帮助我完成这个工作吗?
有帮助吗?

解决方案

Symfony 使用 Composer。因此,包含 SDK 的最简单方法就是以某种方式使其与 Composer 大致兼容。

这将需要一个 composer.json 在包的根目录上。创造它。

最简单的解决方案

将类映射指令放入您的 composer.jsonautoload 部分 :

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

然后 Composer 将递归地扫描 src/ 生成自动加载文件时的目录。因此,每个类都会在需要时导入,而无需更改名称空间或任何内容。

缺点是该库仍然不遵循 PSR0,并且包含所有风险。

费力的解决方案

PSR0-通过编辑每个源文件来添加正确的库来验证库 namespaceuse 每个文件顶部的说明。考虑到 SDK 中的类数量,这很简单,但很费力。

然后您可以添加 autoload 包的部分 composer.json, , 像这样 :

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

替代解决方案

当搜索这个API时,我发现 consolibyte/quickbooks-php Packagist 上的这个……也许值得一试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top