在Symfony2项目上使用外部非PSR-0库的正确方法

时间:2014-06-04 15:24:42

标签: php symfony autoload autoloader symfony-2.4

我正在开发一个应用程序,它将通过他们的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控制器中的库,这是我怀疑的地方,我如何轻松实现这一目标?我阅读了很多文档link1Symfony Class Loader Component和其他一些文档,但我甚至都不清楚。现在我已经在我的/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 Component的解决方案?
  • 你能给我一些想法甚至一些代码来帮我搞定吗?

1 个答案:

答案 0 :(得分:4)

Symfony使用Composer。因此,包含SDK的最简单方法是大致使其与Composer兼容,无论如何。

这需要包的根目录composer.json。创建它。

最简单的解决方案

composer.json的{​​{1}}部分中添加一个classmap指令:

autoload

然后,在生成自动加载文件时,Composer将递归扫描"autoload": { "classmap": ['src/'], }, 目录。因此,每个类都将在需要时导入,而无需更改名称空间或任何内容。

缺点是图书馆仍然没有遵循PSR0,包括所有风险。

费力的解决方案

PSR0-ify库通过编辑每个源文件在每个文件的顶部添加正确的src/namespace指令。考虑到SDK中的类数,这很简单,但很费力。

然后,您可以添加包use的{​​{1}}部分,如下所示:

autoload

替代解决方案

在搜索此API时,我在包装上发现了consolibyte/quickbooks-php这个...也许值得一试。