在 Symfony 中使用预先存在的库

Posted

技术标签:

【中文标题】在 Symfony 中使用预先存在的库【英文标题】:Using pre existing library in Symfony 【发布时间】:2013-10-30 16:13:38 【问题描述】:

我是 Symfony 的新手。我正在尝试使用我用于支付网关 API 的预先存在的库和 Symfony (v2.3)。

在使用 Symfony 之前,我会在根目录中有一个 composer.json 文件,我会简单地使用 php require 'vendor/Braintree...。但是,对于 Symfony,我很难通过将支付网关 API 库导入到我的控制器来使用它。

注意:我在同一个控制器中使用了一个实体,如下所示,它具有类似的目录结构并且效果很好:

use Jets\JetsBundle\Entity\Company;

这是我尝试使用的支付网关 API:

use Jets\JetsBundle\Braintree\braintree\braintree_php\lib\Braintree;

Braintree.php 包含:

namespace Widb\WidbBundle\Braintree\braintree\braintree_php\lib;

我不断收到以下错误:

FatalErrorException: Error: Class 'Jets\JetsBundle\Controller\Braintree_Configuration' not found in C:\xampp\htdocs\www\symfony\src\Jets\JetsBundle\Controller\DefaultController.php line 239

DefaultController.php 第 239 行包含:

Braintree_Configuration::environment('sandbox');

附带说明一下,除了将已配置好的库目录从旧服务器拖放到新服务器上的 Symfony 目录之外,我什么也没做。我是否缺少一些配置脚本或cmd 设置或其他什么?

感谢您在这方面提供的任何帮助。如果有人能帮我解决这个问题,我将永远感激不尽。

这是我的DefaultController.php 代码:

http://pastebin.com/kwisEBzL

非常感谢!

【问题讨论】:

你能显示你的DefaultController.php吗? (你可以使用pastebin) 您好 freetrace,请查看已编辑,我添加了 pastebin 控制器代码。 @AnchovyLegend 不如将此库集成到 Sym 中。您只需将其设为独立服务,然后通过某种途径访问它? 嗯......也许很有趣。我该怎么做? 有什么原因你没有在服务器上用 composer 安装它? Composer 在 vendor 目录中设置了一些文件来进行命名空间和类映射,如果你只是复制库,你会丢失这些文件 【参考方案1】:

我不明白你在DefaultController.php 中实际尝试做什么,但我有一些假设。

UPD:

FIRSTSECOND 点已删除。

第三:

当您尝试创建use Jets\JetsBundle\Braintree\braintree\braintree_php\lib\Braintree; 时,您只能从文件Braintree.php 加载类Braintree。不是带有其他数据的整个文件,例如 require_once 指令。

第四:

/vendor Symfony2 项目的目录通常包含第三方库。所以你可以把你的lib放在这里。

希望以上几点对您有所帮助。

P.S.抱歉英语不好。

【讨论】:

感谢您的回复。你测试过你的答案吗?它对我不起作用,我仍然收到相同的消息。请在回答之前测试您的答案,选项 1-3 也适用于我的代码的未编辑版本...不过我很感激您的回复。 我已经更新了我的答案。您是否尝试使用require_once Braintree.php; 而不是use【参考方案2】:

这个 Braintree 项目似乎是 PSR-0,所以你应该可以很容易地使用它。

不要这样做:

use Jets\JetsBundle\Braintree\braintree\braintree_php\lib\Braintree;

没有这样的命名空间。

使用 Composer 包含 Braintree 项目(注意他们已经有 PSR-0 自动加载配置:https://github.com/braintree/braintree_php/blob/master/composer.json)。

编辑:将其添加到您的composer.json,不要忘记运行composer update(或php composer.phar update

更新 2: 正如 cmets 中所指出的,使用稳定的标签/分支是个好主意。这样,如果有重大更改,您可以确保在更新之前修复它们。因此,请务必检查库的版本(2.23 可能不再是最新版本)。

"require": 
    ...
    "braintree/braintree_php": "~2.23"
,

如果您使用全局命名空间,自动加载器应该会拾取所有类(注意前面的斜线):

\Braintree_Configuration::environment('sandbox');

让我知道这是否有效。

旁注,您可能应该创建一个包,在一个集中的地方为您进行配置。

【讨论】:

您能否解释一下您所说的“旁注,您可能应该创建一个捆绑包,在一个集中的地方为您进行配置。” ??? 我个人会将库打包成一个包。该捆绑包会将库打包为服务,它可以获取您的配置值并将它们传递给\Braintree_Configuration:: 调用。 @Andrew 有一个链接,有人已经这样做了。我不确定你还想知道什么... 不错的答案。稍微偏离主题:我会将所需的版本从通用的dev-master 更改为更稳定的版本,例如~2.23。这最大限度地减少了通过安装处于不稳定状态的供应商库来破坏应用程序的机会。【参考方案3】:

你真的错过了第一批 cmet 中的一个。它很准确,很可能会消除很多头痛。

按照https://github.com/cometcult/CometCultBraintreeBundle 给出的说明进行操作,这是一个提供“Braintree”的捆绑包。在这种情况下,捆绑包实际上是一个“模块”,您可以挂接并通过配置文件进行配置。

处理作曲家缺少的相关命令:

http://getcomposer.org/doc/03-cli.md#install http://getcomposer.org/doc/03-cli.md#require

一旦你完成它,你应该看看底部的两个部分,除了配置所有东西。

$factory = $this->get('comet_cult_braintree.factory');
$customerService = $factory->get('customer');

如果您需要更多帮助,请告诉我

【讨论】:

以上是关于在 Symfony 中使用预先存在的库的主要内容,如果未能解决你的问题,请参考以下文章

制作具有多个类的库,附加预先存在的 .a 库和其他依赖项

使用 Symfony 路由从 .htaccess 重写 URL

Symfony 2.3 Bad Credentials 自定义提供程序

使用 localhost 从主机访问 Vagrant 机器上的 symfony Web 服务器

Symfony 5:/lucky/number 应用程序的 404 页面

Symfony,在表单中预先提示/显示验证约束消息