allysonsilva/laravel-artisan-domain-contexts

一个用于在领域上下文中使用 artisan 命令的 Laravel 扩展包

v2.2.0 2022-10-12 13:52 UTC

This package is auto-updated.

Last update: 2024-09-19 07:36:25 UTC


README

Social Card of Laravel Artisan Domain Contexts

PHP Version Laravel Version CI Status PHPCS - GitHub Workflow Status PHPMD - GitHub Workflow Status PHPStan - GitHub Workflow Status Coverage Status Code Quality/Consistency Latest Version Total Downloads MIT Licensed

目录

概览

本包提供在不同 领域上下文 中使用 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"

🔧 配置

  1. app 文件夹内创建一个与 config('context.folders.domain') 配置相同的文件夹

  2. 将特质添加到 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;
  3. 在领域文件夹 (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:freshmigrate: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:resetmigrate:rollbackmigrate:statusmigrate 的行为

  • 所有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)。有关更多信息,请参阅许可文件