35

Symfony 最佳实践中,建议不要使用包来组织业务逻辑。

仅当其中的代码打算在其他应用程序中按原样重用时,才应使用捆绑包:

但是捆绑包意味着可以作为独立软件重用的东西。如果 UserBundle 不能在其他 Symfony 应用程序中“按原样”使用,那么它不应该是它自己的包。

所以,当我将我的应用程序从 Symfony 3.3 升级到 Symfony 4 时,我认为这是重新组织我的代码的正确时机。

目前我遵循“捆绑结构”:

- src
   - AppBundle
      - Controller
      - Entity
      - Repository
      - Resources
      - ...
   - MyNamespace
      - Bundle
          - BundleTodo
              - Controller
              - Entity
              - Repository
              - Resources
              - ...
          - BundleCatalog
              - Controller
              - Entity
              - Repository
              - Resources
              - ...
          - BundleCart
              - Controller
              - Entity
              - Repository
              - Resources
              - ...
          - ...

现在,有了新的目录结构,我应该如何组织我的代码?

我想这样组织它:

-src
   - Core
      - Controller
      - Entity
      - Repository
      - ..
   - Todos
      - Controller
      - Entity
      - Repository
      - ..
   - Catalog
      - Controller
      - Entity
      - Repository
      - ..
   - Cart
      - Controller
      - Entity
      - Repository
      - ...

但是,这是正确的吗?Symfony 4 和 Flex 的预期文件夹结构有什么问题吗?

或者更好的是这样的:

-src
   - Controller
       - Core
       - Todos
       - Catalog
       - Cart
       - ...
   - Entity
       - Core
       - Todos
       - Catalog
       - Cart
       - ...
   - Repository
       - Core
       - Todos
       - Catalog
       - Cart
       - ...
   - ...

这同样适用于项目目录结构中描述的其他根文件夹(关于如何覆盖它)。

在决定我的新文件夹结构时,是否有任何规则或限制需要考虑?

试图解决问题

所以,为了解决这个问题,我会更深入地研究文档,我会在这里写下我会发现的东西。


4

3 回答 3

16

康威定律:

设计系统的组织……被限制生产的设计是这些组织的通信结构的副本。

您应该围绕如何组织工作来设计目录结构。

如果您或您的同事在每个功能基础上进行全栈工作,您应该按功能对代码进行分组。它将使导航和代码发现更容易。

如果您或您的同事在后端、前端、翻译等方面非常专业,您应该围绕它组织您的代码。基于每个功能的目录结构将支持明确的职责划分。

此外,深度应取决于您预计项目的规模。如果这将是 5 人以上的 5 年以上的努力,那么您可能应该使用嵌套拆分每个功能和每个功能,如前所述,具体取决于工作组织。如果这将是一个人的 3 个月项目,即一些简单的内部工具,您可能应该使用更扁平的结构。我还建议坚持默认设置。

此外,我发现这篇文章内容丰富:https ://blog.nikolaposa.in.rs/2017/01/16/on-structuring-php-projects/

于 2018-07-04T22:01:57.943 回答
13

2nd 结构非常适合复杂的应用程序,业务领域分裂。
Symfony 4 很容易以这种方式配置其应用程序。

├─ assets/
├─ bin/
│  └─ console
├─ config/
│  ├─ doctrine/ 
│  │    ├─ core/
│  │    └─ sample/
│  ├─ packages/
│  ├─ routes/
│  └─ validator/
│  │    ├─ core/
│  │    └─ sample/
├─ public/
│  └─ index.php
├─ src/
│  ├─ Core/         
│  │  ├─ Controller/
│  │  ├─ Entity/
│  │  ├─ Repository/
│  │  └─ ...
│  ├─ Sample/      
│  └─ ...
├─ templates/
│  ├─ core/
│  └─ sample/
├─ tests/
├─ translations/
├─ var/
│  ├─ cache/
│  ├─ log/
│  └─ ...
└─ vendor/

稍加配置:服务自动连接、自动配置等......就像一个魅力。

# config/packages/doctrine.yaml
doctrine:
    # ...
    orm:
        # ...
        auto_mapping: true
        mappings:
            App\Core:
                is_bundle: false
                type: yml
                dir: '%kernel.project_dir%/config/doctrine/core'
                prefix: 'App\Core\Entity'
                alias: 'AppCore'


#config/routes/annotations.yaml
core_controllers:
    resource: ../../src/Core/Controller/
    type: annotation


# config/services.yaml
# But I prefer to put this on a separate config/services/_auto.yaml
services:
    App\:
        resource: '../../src/*/*'
        exclude: '../../src/*/{Entity,Migrations,Tests,Kernel.php}'

    app_controller:
        namespace: App\
        resource: '../../src/*/Controller'
        tags: ['controller.service_arguments']
于 2018-08-27T09:53:05.060 回答
11

正如评论中所说,Symfony 可以很好地与所有这些结构一起工作,所以我们确实不能在这里有一个公认的答案,但这是我的两分钱。

老实说,最佳实践是独立于框架来组织架构(主要是因为这个原因,Symfony 4 不再强加捆绑包)。

但实际上,除了非常具体或复杂的项目外,拥有一个“面向symfony”的组织会更实用。

以下是我的个人喜好,也受到我项目类型的强烈影响(面向 CRUD,Rest API,没有强大的业务逻辑)

一般来说,我正在朝着这样的结构迈进:

-src
   - Controller
       - Core
       - Todos
       - ...
   - Entity
       - Core
       - Todos
       - ...
   - Repository
       - Core
       - Todos
   - Validator (or other Symfony oriented components)
       - Core
       - Todos
   - Others (depend on project)
       - Core
       - Todos
   - ...

原因是:

  • 使用 autowire 减少服务定义 - 是的,我很懒 ;-)

    如果您需要将存储库或控制器注册为服务,您可以通过一个声明来完成。

  • 在 Symfony Flex 配方中,通常使用这种结构。

    DoctrineBundle 例如初始化src/Entitysrc/Repository包含实体的文件夹和配方也使用此结构。

但请记住,Symfony Flex 不是强制性的。其目的主要是为了简化项目的初始化并使框架更容易被初学者使用

于 2018-03-16T20:25:46.840 回答