yceruto / symfony-skeleton
适用于多个应用的Symfony骨架。
Requires
- php: >=8.0.2
- ext-ctype: *
- ext-iconv: *
- symfony/console: 6.*
- symfony/dotenv: 6.*
- symfony/flex: ^1.17
- symfony/framework-bundle: 6.*
- symfony/runtime: 6.*
- symfony/yaml: 6.*
Requires (Dev)
- yceruto/ddd-maker-bundle: ^1.1
Conflicts
Replaces
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.com
和admin.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 许可证 发布。