在 Symfony2 项目上使用外部非 PSR-0 库的正确方法
-
21-12-2019 - |
题
我正在开发一个应用程序,该应用程序将通过其 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
文件夹如图所示:
这 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.json
的 autoload
部分 :
"autoload": {
"classmap": ['src/'],
},
然后 Composer 将递归地扫描 src/
生成自动加载文件时的目录。因此,每个类都会在需要时导入,而无需更改名称空间或任何内容。
缺点是该库仍然不遵循 PSR0,并且包含所有风险。
费力的解决方案
PSR0-通过编辑每个源文件来添加正确的库来验证库 namespace
和 use
每个文件顶部的说明。考虑到 SDK 中的类数量,这很简单,但很费力。
然后您可以添加 autoload
包的部分 composer.json
, , 像这样 :
"autoload": {
"psr-0": {
"QBO\\": "src/"
}
},
替代解决方案
当搜索这个API时,我发现 consolibyte/quickbooks-php Packagist 上的这个……也许值得一试。
不隶属于 StackOverflow