我在哪里将通用库代码放在Symfony 2中?

时间:2013-11-11 17:00:52

标签: php symfony

快速提问:我应该将具有类似特征的代码放在 Controller Utilities Service Class 的代码中,如Benjamin Eberlei(http://www.whitewashing.de/2013/06/27/extending_symfony2__controller_utilities.html)在此博客文章中所述?

对于过渡期,我把它放在:src / ProjectName / Library

上下文

我注意到以下内容:

  • 此逻辑不属于特定的捆绑,实际上它适用于所有要创建的捆绑包。
  • 此逻辑通常属于特定于应用程序的库,而不是作为bundle的一部分,因为bundle中的控制器会扩展或利用此库代码。

我找到了一些与主题相似的问题的答案,但不完全是我之后的问题

基于我在这里单独研究的问题,这个问题似乎已经被某种程度上踩到了死亡,但我认为之前提出的问题都围绕着我实际所追求的问题。无论如何,我似乎有以下选择:

  • 将这些类型的扩展放在一个包中 - 不适用于我正在开发的功能类型,实质上是扩展框架代码。
  • 为所有库代码所在的项目创建供应商目录 - 如果这确实是最佳实践,那么这实际上意味着我必须通过私有方式使库可用作曲家中的repo,但这意味着我必须维护一个单独的代码库。
  • 创建一些存在于src / Company / SomeNamespace中的伪连接器包 - 我甚至不知道这是否完全可行,但如果它与顺丰最佳实践,我会进一步研究。

这个问题,简而言之:我在哪里提供在Symfony 2中提供通用,全局功能的类?

我提前感谢。

2 个答案:

答案 0 :(得分:2)

这篇关于composer repositories的文档是一个很好的参考,documentation about packages that don't support Composer应该是你想要的。

另外我想要注意documentation about VCS,当你需要分叉一个Bundle并覆盖原来的那个时(我经常使用它几次)。

您可以执行以下操作 - 它不需要您拥有包装系统或其他任何东西。您只需要将程序包作为可由您的计算机使用URL访问的邮件包。

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "my/package",
                "version": "1.0.0",
                "dist": {
                    "url": "https://github.com/my/package/archive/master.zip",
                    "type": "zip"
                },
                "autoload": {
                    "psr-0": {
                        "My\\Package\\": "src/"
                    }
                }
            }
        }
    ],
    "require": {
        "my/package": "1.0.0"
    }
}

如果您的软件包不支持PSR-0,那么您需要使用the option "classmap",否则您的软件包支持PSR-0,您需要使用the option psr-0

答案 1 :(得分:1)

经过一番捣乱,虽然这里接受的答案具有优点,但我决定创建一个" Core" bundle,它将容纳我的所有项目交叉捆绑/应用程序范围的依赖项和资源。

这将使我能够拥有所有资产,相关实体和项目特定库代码的中心位置。

定位重构

我内心向自己推断,这是一个快乐的中间立场(也许是暂时的)解决方案,这使我能够继续发展,而不是我现在所处的分析瘫痪状态。 。

以这种方式做事,我可以让flex点稍后重构到供应商目录解决方案。

如果你正在开展一个项目,并且因为有些不自然的感觉让你的实体和库代码像我一样分散在不同的包中,这将是一个很好的解决方案。

它不会更改SF2和Doctrine 2的默认行为

我之前已经对Symfony 2 Doctrine 2配置进行了修改,这允许我(正确地)将实体从包中删除并进入单独的中央命名空间。

我喜欢这个主意。我用了一段时间。使用这种方法的警告是,当您需要创建Doctrine实体时,您不再能够使用命令行界面,因为需要捆绑命名空间。

我认为这很好,因为无论如何我需要改变一切,但后来我想:

  • " Form对象怎么样?我把它放在哪里?在/ src下自己的目录下就像Entity一样?
  • 服务层怎么样? (不是DI,而是实际的服务层 - 应用程序逻辑所在的位置)"

写下另一个"我在哪里把XXXX放在Symfony 2"类型问题(我确信那些关注PHP和Symfony2标签的人不厌其烦),我已经停止并将其放入捆绑包中,我将其称为资产包,并将其重命名为Core捆绑包

核心套装 这样,它根据CLI的要求捆绑在一起,它更容易理解,我可以在语义上共享该捆绑包的内容,因为它包含特定于应用程序的核心代码:

  • 实体。
  • 通用表格。
  • 通用HTML,CSS和JavaScript资产。
  • 项目特定库代码。
  • My Twig扩展程序也在这里。
  • 最后,服务层类及其相关工厂也会在这里。
  • 如果我想为这个项目向Symfony做任何其他扩展,我会在这里添加它们。

最重要的是,当我有时间真正坐下来和composer等人合作时,我可以很容易地重构它,因为它只存在于一个地方。

因此。简而言之。回答我自己的问题:我在哪里将通用库代码放在Symfony 2中?

我将它放在一个专门用于存储资产,资源和库代码的捆绑包中,这些捆绑包需要使用以下建议访问多个捆绑包:

  • 创建核心包。
  • 将通用库代码放在此处。
  • 将所有实体放在此处。
  • 在这里放置通用资产(main.css,reset.css等)。
  • 在此处填写通用表格。
  • 将所有服务层类放在此处。

通过composer打包并安装

当您开始使用作曲家时,请研究如何将文件结构格式化为PSR-0:

  • 将其格式化为符合PSR-0标准的
  • 将其打包成zip文件并通过composer安装(根据@Thomas Potaires编辑说明)

应用程序/项目 - 构建应用程序但依赖于核心软件包的软件包。


核心软件包 - 在关键点扩展SF2,包含共享资源和库代码。因为我没有改变框架的工作方式,所以文件是SF2期望它们的地方。这意味着我仍然可以使用它的实体生成器。

我在这里生成脚手架/ CRUD屏幕时遇到了问题,因为它们将被视为原型,而不是真正的应用程序功能。


SF2 Layer。 - 保持不变,不受影响。延长。