Paypal SDK类名冲突

时间:2014-01-27 23:19:46

标签: cakephp paypal composer-php

我想在CakePHP 2.4.x应用程序中使用Paypal Adaptive Payments和Paypal Adaptive Accounts库。我正在通过作曲家加载它们。我的composer.json文件如下所示:

{
"require": {
    "paypal/adaptivepayments-sdk-php":"v3.6.106",
    "paypal/adaptiveaccounts-sdk-php":"v3.6.106"
},
"config": {
    "vendor-dir": "Vendor"
}
}

这两个库都包含Paypal / Types / Common / RequestEnvelope.php,对于每个lib,它们都是不同的。我正在与这个类名冲突,而没有使用正确的类名。我相信解决方案是在我的composer.json中使用自动加载。我已阅读文档,不相信我正确使用它。这是我正在尝试的:

{
"require": {
    "paypal/adaptivepayments-sdk-php":"v3.6.106",
    "paypal/adaptiveaccounts-sdk-php":"v3.6.106"
},
"config": {
    "vendor-dir": "Vendor"
},
"autoload": {
    "psr-4": {
        "AdaptivePaymentsLib\\": "Vendor/paypal/adaptivepayments-sdk-php/lib",
        "AdaptiveAccountsLib\\": "Vendor/paypal/adaptiveaccounts-sdk-php/lib"
    }
}
}

在我的控制器中,我试图像这样调用RequestEnvelope:

$ requestEnvelope = new AdaptivePaymentsLib \ PayPal \ Types \ Common \ RequestEnvelope(“en_US”);

没有被发现。 Active Accounts最近才被添加到项目中。以前使用$ requestEnvelope = new PayPal \ Types \ Common \ RequestEnvelope(“en_US”)获取请求信封的工作正常;因此,只有增加了冲突并导致破裂的账户。

1 个答案:

答案 0 :(得分:1)

您不应该为依赖项定义自动加载 - 这是他们要解决的任务。

如果您查看paypal / adaptivepayments-sdk-php的composer.json文件,您会看到:

"autoload": {
    "psr-0": {
        "PayPal\\Service": "lib/",
        "PayPal\\Types": "lib/"
    }
}

如果你在paypal / adaptiveaccounts-sdk-php中查看同一个文件,你会看到:

"autoload": {
    "psr-0": {
        "PayPal\\Service": "lib/",
        "PayPal\\Types": "lib/"
    }
}

安装完成后,Composer会使用以下内容创建文件vendor/composer/autoload_namespaces.php

return array(
    'PayPal\\Types' => array($vendorDir . '/paypal/adaptivepayments-sdk-php/lib', $vendorDir . '/paypal/adaptiveaccounts-sdk-php/lib'),
    'PayPal\\Service' => array($vendorDir . '/paypal/adaptivepayments-sdk-php/lib', $vendorDir . '/paypal/adaptiveaccounts-sdk-php/lib'),
    'PayPal' => array($vendorDir . '/paypal/sdk-core-php/lib'),
);

所以这两个库都包含在这里,我毫不怀疑自动加载会起作用。

对于具有不同内容的重复类,您无法真正做到这一点。你在Github上打开了一个问题吗?如果没有让开发团队意识到这个问题,它就永远不会得到解决。

作为一个黑客,您可以定义一个安装后和更新后的脚本,删除其中一个文件。有关详细信息,请参阅the composer documentation。 Composer接受任何shell命令或对PHP类的静态调用。我会在这里使用shell命令。