yceruto/symfony-skeleton

适用于多个应用的Symfony骨架。

v6.0 2022-05-15 17:36 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:35 UTC


README

使用内核上下文组织和管理多个应用。

该项目骨架旨在实现领域驱动设计 (DDD) 和 六边形架构 模式。它也非常适合用于微服务架构。

安装

composer create-project yceruto/symfony-skeleton ddd

基于上下文的内核

Symfony中的基于上下文的内核是指Kernel类的一种自定义实现,它允许在单个项目仓库中运行多个应用,每个应用都有自己的上下文(例如api.example.comadmin.example.com)。不同的上下文对最终用户是透明的,但能够实现关注点的清晰分离和代码库的组织。

每个上下文对应一个独立的入口点(网站、API或管理),每个入口点都有自己的专用路由和配置。尽管存在这种分离,但像依赖项和业务逻辑这样的公共代码在所有上下文之间共享。内核使用请求的上下文来确定适当的入口点来处理请求,确保每个上下文都使用正确的路由和配置。

基于上下文的配置

项目结构包括一个名为context/的新目录,其中配置和展示相关的文件根据内核上下文进行组织。src/目录包含应用程序的核心功能,分为模块以实现更好的组织和管理工作。

├── config/
│   ├── packages/
│   ├── bundles.php
│   └── services.yaml
├── context/
│   ├── admin/
│   │   ├── config/
│   │   │   ├── packages/
│   │   │   ├── bundles.php
│   │   │   ├── routes.yaml
│   │   │   ├── security.yaml
│   │   │   └── services.yaml
│   │   └── src/
│   │       ├── Command/
│   │       └── Controller/
│   ├── api/
│   ├── site/
│   └── Kernel.php
├── src/
│   ├── Module/
│   │   └── SubModule/
│   │       ├── Application/
│   │       ├── Domain/
│   │       └── Infrastructure/
│   ├── Shared/
│   │   ├── Domain/
│   │   ├── Infrastructure/
│   │   └── Presentation/
├── var/
│   ├── cache/
│   │   ├── admin/
│   │   │   ├── dev/
│   │   │   └── prod/
│   │   ├── api/
│   │   └── site/
│   └── logs/

项目结构包括admin、api和site等子目录,作为内核上下文方法的一部分。这些目录包含每个上下文特有的所有文件和配置。相比之下,位于config/目录根目录下的文件和目录(如packages/bundles.php等)被视为所有上下文的全局配置。

为了优化性能,每个由内核上下文定义的应用都有自己的依赖注入容器文件、路由配置和特定设置。然而,如vendor/config/src/代码这样的公共元素在所有上下文之间共享。这种方法允许进行高效的资源管理和代码库的组织。

为所有应用保留一个入口点

├── public/
│   └── index.php

遵循Symfony 4的哲学,可以使用环境变量来确定应用的模式(开发/测试/生产)以及是否启用了调试模式。此外,必须创建一个名为APP_CONTEXT的新环境变量来指定应运行的内核上下文。这可以通过在启动服务器之前设置环境变量,使用PHP内置的内置web服务器轻松测试。

$ APP_CONTEXT=admin php -S 127.0.0.1:8000 -t public
$ APP_CONTEXT=api php -S 127.0.0.1:8001 -t public   

使用Symfony本地web服务器

要运行多个内核上下文,您需要使用Symfony本地服务器及其代理功能。

首先,在项目文件夹中运行命令symfony proxy:start以启动Symfony代理。

接下来,为您的每个应用创建指向项目文件夹的符号链接(符号链接)。这些符号链接可以根据您的喜好存储在项目文件夹内或外部。

├── links/
│   ├── admin
|   ├── api
|   └── site
├── config/
├── src/
└── var/

创建符号链接后,您需要配置每个本地服务器并启动它。这可以通过使用之前创建的符号链接来完成。例如,您可能需要运行如下命令:

# start admin local server
APP_CONTEXT=admin symfony proxy:domain:attach admin --dir=[project folder path]/links/admin
APP_CONTEXT=admin symfony server:start --dir=[project folder path]/links/admin

# start api local server
APP_CONTEXT=api symfony proxy:domain:attach api --dir=[project folder path]/links/api
APP_CONTEXT=api symfony server:start --dir=[project folder path]/links/api

# start site local server
APP_CONTEXT=site symfony proxy:domain:attach site --dir=[project folder path]/links/site
APP_CONTEXT=site symfony server:start --dir=[project folder path]/links/site

为了验证每个服务器是否正在运行,您可以在您的网页浏览器中导航到相应的URL localhost:7080

生产和虚拟主机

为了在生产和开发环境中运行多个内核上下文,您需要为每个虚拟主机配置设置环境变量 APP_CONTEXT。这可以通过修改您生产服务器或开发机器上的相应配置文件来完成,具体取决于您的偏好。

<VirtualHost admin.company.com:80>
    # ...
    
    SetEnv APP_CONTEXT admin
    
    # ...
</VirtualHost>

<VirtualHost api.company.com:80>
    # ...
    
    SetEnv APP_CONTEXT api
    
    # ...
</VirtualHost>

按应用程序执行命令

├── bin/
│   └── console.php

使用 --kernel-k 选项运行特定应用程序的任何命令。

$ bin/console about -k api

或者,如果您更喜欢,在命令行界面使用环境变量。

$ export APP_CONTEXT=api
$ bin/console about                         # api application
$ bin/console debug:router                  # api application
$
$ APP_CONTEXT=admin bin/console debug:router   # admin application

此外,您可以在 .env 文件中设置默认的 APP_CONTEXT 环境变量或通过修改 bin/console 文件来设置。这允许您指定如果环境变量未设置或被其他地方覆盖,将使用的默认内核上下文。

按应用程序运行测试

├── tests/
│   └── context/
│       ├── admin
│       │   └── AdminWebTestCase.php
│       └── api/

tests/ 目录将包含一个与主代码库中的 context/ 目录结构相同的 context/ 目录。为了在测试中使用此结构,您需要更新您的 composer.json 文件,将 tests/context/<CONTEXT>/ 目录中的每个目录映射到其相应的 PSR-4 命名空间。这允许您分别测试每个内核上下文。

"autoload-dev": {
    "psr-4": {
        "Admin\\Tests\\": "tests/context/admin/",
        "Api\\Tests\\": "tests/context/api/"
    }
},

运行 composer dump-autoload 重新生成自动加载配置。

为了运行特定内核上下文的全部测试,为每个应用程序创建一个单独的 <CONTEXT>WebTestCase 类。这允许您一起执行所有测试,并独立测试每个内核上下文。

向项目中添加更多应用程序

在您的项目中安装此包。

$ composer require yceruto/ddd-maker-bundle --dev

要创建新的内核上下文骨架,请在终端中运行 bin/console make:ddd:context <CONTEXT> 命令。这将生成新的内核上下文所需的所有文件和目录,使您能够轻松地向应用程序添加新功能。

当安装生成新配置文件的新包时,如果它们不是为所有应用程序而设计的,请确保将它们移动到正确的子应用程序目录。此外,您应更新 composer.json 中的 auto-scripts 部分,以使用正确的内核选项执行每个命令。为了确保为每个单个应用程序清除缓存,建议在您的 composer.json 文件中为每个应用程序包含脚本 "cache:clear -k <CONTEXT>": "symfony-cmd"

许可

本软件依据 MIT 许可证 发布。