allysonsilva / laravel-artisan-domain-contexts
一个用于在领域上下文中使用 artisan 命令的 Laravel 扩展包
Requires
- php: >=8.0
- laravel/framework: ^9.32
- nikic/php-parser: ^4.13
Requires (Dev)
- ergebnis/phpstan-rules: ^1.0
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^7.0
- phpmd/phpmd: ^2.11
- phpstan/phpstan: ^1.0
- phpstan/phpstan-strict-rules: ^1.1
- phpunit/phpunit: ^9.0
- slevomat/coding-standard: ^7.0
- squizlabs/php_codesniffer: ^3.6
- symplify/phpstan-rules: 10.0.21
README
目录
- 概览
- 🚀 安装
- 🔧 配置
- 📖 使用方法
- 🧪 测试
- 📝 更新日志
- 🤝 贡献
- 🔒 安全
- 🏆 贡献者
- 许可
概览
本包提供在不同 领域上下文 中使用 artisan 命令 的能力。它允许在迁移命令和种子文件中进行交互式操作,选择要执行哪个类。
概念
什么是“领域”?
- 术语 "领域" 与 URL 或主机 (www.example.com) 没有关系,而是与 业务、特定的活动或知识领域 有关。换句话说,"领域" 就是公司的 业务 本身。
- "领域" 是 DDD (领域驱动设计) 的第一个(主要 😏)单词,它是公司的业务。
参见 这篇文章 以获得更好的理解!
什么是“上下文”?
- 如果 "领域" 是公司的业务,那么 "上下文" 就是该业务的各个部分,即 相关事物的组,业务逻辑的不同部分。例如,在在线商店业务中,我们可能有订单、客户、产品等上下文。"领域" 是在线商店的业务,上下文是同一业务的各个部分。
参见 这篇文章 以获得更好的理解!
问题
我应该在使用默认 Laravel 框架时使用这个包吗?
不,因为 artisan
处理的文件已经在默认文件夹中。
我应该何时使用这个包?
- 当文件夹结构不是 Laravel 的默认结构时。
- 当需要时,例如,在应用程序的不同上下文/文件夹中执行/操作
artisan
命令。
🚀 安装
要求
该包已开发和测试,以满足以下最低要求
- PHP 8.0
- Laravel 8.70
Laravel 版本兼容性
安装包
您可以通过 Composer 安装包
composer require allysonsilva/laravel-artisan-domain-contexts
发布配置
然后您可以使用以下命令发布包的配置文件
php artisan vendor:publish --tag="context-config"
🔧 配置
-
在
app
文件夹内创建一个与config('context.folders.domain')
配置相同的文件夹 -
将特质添加到
app/Console/Kernel.php
文件中,以便在所有 Laravel 命令中使用使用选项use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; +use Allyson\ArtisanDomainContext\Concerns\ArtisanConsoleTrait; class Kernel extends ConsoleKernel { + use ArtisanConsoleTrait;
-
在领域文件夹 (
config('context.folders.domain')
) 内,您可以找到 Laravel 组件(如迁移、种子、模型、作业等)。类的文件夹名称位于config('context.folders.components')
的配置中。
📖 使用方法
为了使用上下文命令,以下选项已添加到Laravel命令中
--context
--context-namespace
--all-contexts
--only-default
--multi-databases
某些选项仅在特定命令中可用,但下面的所有命令中都存在--context
选项!
使用这些选项处理的标准Laravel命令列表可以在下表查看。
理解 --context
选项
此选项在下面的所有命令中都存在!
当在命令中传递此选项时,组件/类/资源将被根据config('context.folders.components')
中的资源类型设置进行操作或创建。
要更改类应该被操作或创建的文件夹的路径/名称,请查看config('context.folders.components')
中的配置。
示例
例如,要创建特定上下文(例如用户上下文)中的中间件,可以使用以下命令: php artisan make:middleware --context=User YourMiddleware
。
在app/Domain/User/Http/Middlewares/YourMiddleware.php
中创建了一个中间件类。
如果config('context.folders.components.middlewares')
的值为Http/AnotherFolder
而不是默认的Http/Middlewares
,并且执行了上述命令,则类将创建在app/Domain/User/Http/AnotherFolder/YourMiddleware.php
。
理解 --context-namespace
选项
此选项仅用于make
命令,有关其说明,请参阅此处。
理解 --all-contexts
选项
当在命令中传递此选项时,它将以非交互方式执行,即执行特定上下文的筛选类。
此选项仅在迁移和db:seed
命令中存在,不在make
命令中。请参阅下表。
它与--force
选项具有相同的行为。
理解 --only-default
选项
默认情况下,如果没有传递选项,则迁移命令在所有上下文中执行。要使用Laravel默认文件夹(database/migrations
)运行迁移命令,请使用此选项。
此选项仅在迁移和db:seed
命令中存在。它不在make
命令中。
理解 --multi-databases
选项
此选项仅存在于迁移命令中!
默认情况下,迁移命令在DB_DATABASE
env中配置的数据库上执行,因此您只能在命令中使用一个数据库。使用此选项,您可以通过配置config('context.migrations.databases')
使用多个数据库执行同一命令。
当传递此选项时,则根据config('context.migrations.databases')
的配置在不同的数据库上执行命令。
config('context.migrations.databases')
的配置指的是将要执行操作的数据库名称。
使用上下文的命令列表
🏗 make
命令
当未指定上下文时,制作命令将在给定上下文或Laravel默认文件夹中创建文件。
上表中列出的所有make
命令在其命令中有两个选项,分别是
-
--context
:创建类的文件夹名称,如果未在命令中传递,则类将在Laravel默认文件夹中创建。 -
--context-namespace
:将用于替换类正常命名空间的自定义命名空间。
要更改类创建的组件文件夹的名称,请查看以下配置config('context.folders.components')
。
示例
以下示例命令将使用以下文件夹组织
app/
├── Domain
│ ├── Foo
│ ├── Post
└── └── User
如何在特定上下文中创建[MIGRATION]?
以下是一个示例命令,使用--context
选项,并传递创建迁移的上下文名称。
迁移文件将根据命令的--context
选项保存在config
文件夹中,具体位置为context.folders.components.migrations
,在context
文件夹内。
php artisan make:migration --context=Post create_posts_table
新迁移已创建于: app/Domain/Post/Database/Migrations/2022_xx_xx_xxxxxx_create_posts_table.php
文件路径部分包括
Domain
: 根据config('context.folders.domain')
配置的值。Post
:--context
选项的值。Database/Migrations
: 根据config('context.folders.components.migrations')
配置的值。
如何在特定上下文中创建一个[作业]?
与之前的迁移示例相同,创建特定上下文中的新作业也使用--context
选项。
php artisan make:job --context=Foo MyJob
新作业已创建于: app/Domain/Foo/Jobs/MyJob.php
文件路径部分包括
Domain
: 根据config('context.folders.domain')
配置的值。Foo
:--context
选项的值。Jobs
: 根据config('context.folders.components.jobs')
配置的值。
如何创建具有自定义命名空间类/组件?
使用--context-namespace
选项来自定义类命名空间前缀。
如果您想创建具有特定命名空间的模式,以下是一个示例命令。
php artisan make:model --context=Post --context-namespace=PostDomain Post
上述命令将在以下路径中创建模式:app/Domain/Post/Models/Post.php
内容如下
<?php
+namespace PostDomain\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
}
上述类的命名空间为:namespace PostDomain\Models
。
如何在Laravel的默认文件夹中创建类?
要在默认Laravel文件夹中创建类,不要使用/传递--context
选项!
以下命令将在Laravel的默认文件夹app/Events/MyEvent.php
中创建类。
php artisan make:event YourEvent
migrate
命令
迁移命令是交互执行的,您甚至可以选择每个单独的迁移,或在一个特定上下文中执行所有迁移的操作。
以下是在命令中可能出现的选项
-
--context
: 迁移应执行的上下文。 -
--all-contexts
: 命令必须在所有上下文的迁移上运行。 -
--only-default
: 如果传递此选项,则仅使用默认Laravel文件夹
(database/migrations
)中的迁移来执行命令。 -
--multi-databases
: 将在所有配置数据库config('context.migrations.databases')
上运行命令。
为了展示迁移命令的效果,让我们以下面的文件夹组织为例,并查看预期的结果
app
└── Domain
├── Foo
│ └── Database
│ ├── Migrations
│ │ ├── 2022_02_30_000000_create_baz_table.php
│ │ └── 2022_02_30_000000_create_foo_table.php
│ └── Seeders
│ ├── BazTableSeeder.php
│ └── FooTableSeeder.php
├── Post
│ └── Database
│ ├── Migrations
│ │ ├── 2022_02_30_000000_create_posts_1_table.php
│ │ ├── 2022_02_30_000000_create_posts_2_table.php
│ │ └── 2022_02_30_000000_create_posts_3_table.php
│ └── Seeders
│ ├── PostsTableSeeder1.php
│ ├── PostsTableSeeder2.php
│ └── PostsTableSeeder3.php
└── User
└── Database
├── Migrations
│ ├── 2022_02_30_000000_create_users_1_table.php
│ ├── 2022_02_30_000000_create_users_2_table.php
│ └── 2022_02_30_000000_create_users_3_table.php
└── Seeders
├── UsersTableSeeder1.php
├── UsersTableSeeder2.php
└── UsersTableSeeder3.php
理解 migrate:fresh
和 migrate:refresh
的行为
- 两者具有相同的选项集:
--context
和--only-default
migrate:refresh
还有一个额外的选项,即--multi-databases
两者以相同的方式工作/总结:
- 当没有传递选项给命令时,默认情况下会执行所有上下文的迁移。因此,它没有
--all-contexts
选项。好吧,它与有选项时的行为相同。 - 不能单独选择/选择迁移。
- 从给定上下文、所有上下文或Laravel的默认文件夹运行所有迁移。
查看以下问题和答案以获得更好的理解
-
如何在特定上下文中运行命令?
php artisan migrate:<fresh or refresh> --context=YOUR_CONTEXT
-
如何在所有上下文中运行命令?
php artisan migrate:<fresh or refresh>
-
如何仅在默认Laravel迁移文件夹中运行命令?
php artisan migrate:<fresh or refresh> --only-default
-
我如何能够在多个数据库上运行命令?(仅刷新)
# In all config databases `config('context.migrations.databases')` php artisan migrate:refresh --multi-databases # Or on multiple databases of a specific context: php artisan migrate:refresh --context=User --multi-databases
📹 migrate:fresh
示例
查看以下演示以获得更好的理解
📹 migrate:refresh
示例
查看以下演示以获得更好的理解
理解 migrate:reset
、migrate:rollback
、migrate:status
和 migrate
的行为
- 所有4个命令都有以下选项
--context
--all-contexts
--only-default
--multi-databases
所有命令的总结:
- 默认情况下,将始终显示一个列表,供您从其中选择迁移。无论是所有上下文的迁移,还是使用
--context
选项的特定上下文的迁移,都会有可供选择并用于命令中的迁移列表。要运行非交互式命令,请使用--force
选项。 - 当命令未传递任何选项时,默认操作是列出所有上下文的迁移,使用Artisan的
choice
方法。 - 要运行所有上下文的迁移命令,请使用
--all-contexts
选项。
查看以下问题和答案以获得更好的理解
$command
变量可以是以下项之一:['migrate:reset', 'migrate:rollback', 'migrate:status', 'migrate']
。
-
如何在特定上下文中运行命令?
# A list of migrations present in the context will appear to be chosen for execution! php artisan $command --context=YOUR_CONTEXT # To execute in a "forced" way, that is, all migrations from a given context, use the `--force` option! php artisan $command --context=YOUR_CONTEXT --force
-
如何在所有上下文中运行命令?
# List of migrations to choose which will be performed php artisan $command # Run migrations from all contexts "forced" php artisan $command --all-contexts
-
如何仅在默认Laravel迁移文件夹中运行命令?
php artisan $command --only-default
-
我如何运行多个数据库上的命令?
# In all config databases `config('context.migrations.databases')` php artisan $command --multi-databases # Or on multiple databases of a specific context: php artisan $command --context=User --multi-databases # Or force execution of the command php artisan $command --context=User --multi-databases --force
📹 migrate:reset
示例
查看以下演示以获得更好的理解
📹 migrate:rollback
示例
查看以下演示以获得更好的理解
db:seed
命令
命令中有三个选项。
--context
--all-contexts
--only-default
查看以下问题和答案以获得更好的理解
-
如何在特定上下文中运行命令?
# A list of seeders present in the context will appear to be chosen for execution! php artisan db:seed --context=YOUR_CONTEXT # To execute in a "forced" way, that is, all seeders from a given context, use the `--force` option! php artisan db:seed --context=YOUR_CONTEXT --force
-
如何在所有上下文中运行命令?
# List of seeders to choose which will be performed php artisan db:seed # Run seeders from all contexts "forced" php artisan db:seed --all-contexts
-
如何仅在默认Laravel迁移文件夹中运行命令?
php artisan db:seed --only-default
📹 db:seed
示例
查看以下演示以获得更好的理解
🧪 测试
composer test:unit
📝 更新日志
有关此包的变更信息,请参阅CHANGELOG。
🤝 贡献
有关详细信息,请参阅CONTRIBUTING。
🔒 安全
如果您发现任何安全相关的问题,请通过github@allyson.dev发送电子邮件,而不是使用问题跟踪器。
🏆 贡献者
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。