9

快速提问:我应该将与控制器实用程序服务类具有相似特征的代码放在哪里,如 Benjamin Eberlei 的这篇博客文章中所述(http://www.whitewashing.de/2013/06/27/extending_symfony2__controller_utilities.html) ?

在此期间,我将其放在:src/ProjectName/Library

语境

我注意到以下几点:

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

我找到了一些主题相似的问题的答案,但不完全是我所追求的

根据我对 SO 的研究,这个问题似乎在某种程度上被踩死了,但我认为之前提出的问题围绕着我真正追求的东西。无论如何,我似乎有以下选择:

  • 将这些类型的扩展放在一个包中- 不适用,因为我正在开发的功能类型本质上是扩展框架代码。
  • 为所有库代码所在的项目创建一个供应商目录- 如果这确实是最佳实践,那么它本质上意味着我必须通过 composer 中的私有 repo 使库可用,但这意味着我' d 必须维护一个单独的代码库。
  • 创建某种存在于 src/Company/SomeNamespace 中的伪连接器包 - 我什至不知道这是否完全可行,但如果它符合 SF 最佳实践,我会调查它更远。

再次为简洁起见,问题是:在 Symfony 2 中,我应该将提供通用、全局功能的类放在哪里?

提前致谢。

4

2 回答 2

2

这个关于作曲家存储库的文档是一个很好的参考,关于不支持作曲家的包的文档应该是你正在寻找的。

另外我想注意一下有关 VCS 的文档,当您需要分叉一个 Bundle 并覆盖原始包时经常使用该文档(我使用了很多次)。

您可以执行以下操作 - 它不需要您拥有包装系统或其他任何东西。您只需要将包以 zip 格式放入计算机使用 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,那么您需要使用选项“classmap”,否则您的包支持 PSR-0,您需要使用选项 psr-0

于 2013-11-12T05:42:05.253 回答
1

经过一番折腾,虽然这里接受的答案有其优点,但我决定创建一个“核心”包,它将容纳我所有的项目跨包/应用程序范围的依赖项和资源。

这将使我能够为所有资产、相关实体和项目特定的库代码提供一个中心位置。

定位于重构

我在内部对自己进行了推理,这是一个快乐的中间地带(也许是暂时的)解决方案,它使我能够继续发展,而不是我目前所处的分析瘫痪状态。

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

如果您正在从事一个项目,并且对像我一样将实体和库代码分散在不同的包中的感觉有些不自然而感到厌烦,这将是一个很好的解决方案。

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

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

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

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

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

在写另一个“我在 Symfony 2 中哪里可以放 XXXX”类型的问题(我敢肯定那些关注 PHP 和 Symfony2 标签的人已经厌倦了),我已经停下来把它放在我已经称为资产包,并将其重命名为核心包。

Core Bundle 这样,它按照 CLI 的要求在一个 bundle 中,它更容易遵循,我可以在语义上共享这个 bundle 的内容,因为它包含特定于应用程序的核心代码:

  • 实体。
  • 通用表格。
  • 通用 HTML、CSS 和 JavaScript 资产。
  • 项目特定的库代码。
  • 我的 Twig 扩展也住在这里。
  • 最后,服务层类和它们相关的工厂也在这里。
  • 如果我想为这个项目对 Symfony 进行任何其他扩展,我将在此处添加它们。

最重要的是,当我有时间真正坐下来与 composer 等人一起工作时,我可以轻松地将其重构出来,因为它们都存在于一个地方。

所以。简而言之。回答我自己的问题:在 Symfony 2 中我应该把通用库代码放在哪里?

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

  • 创建一个核心包。
  • 将通用库代码放在这里。
  • 将所有实体放在这里。
  • 将通用资产(main.css、reset.css 等)放在这里。
  • 把通用表格放在这里。
  • 将所有服务层类放在这里。

通过 composer 打包安装

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

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

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


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

我不会对这里生成的脚手架/CRUD 屏幕有任何问题,因为它们将被视为原型,而不是真正的应用程序功能。


SF2 层。- 保持不变,不变。扩展。


于 2013-11-13T21:13:45.273 回答