juampi92/phpstan-eloquent-bounded-context

PHPStan 规则,确保您的模型仅在其领域内部被修改。

v1.1 2022-09-26 22:59 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:53 UTC


README

一组 PHPStan 规则,确保您的模型仅在其领域内部被修改

Latest Version on Packagist GitHub Tests Action Status Total Downloads

描述

这些规则将检测您的 Eloquent 模型是否在领域外部被修改。一旦模型离开领域命名空间,它将变为只读。

假设以下结构

📁 app
├─ 📁 Http
│  └─ 📁 Controllers
│     └─ 📃 PostController.php
└─ 📁 Domains
   └─ 📁 Posts
      └─ 📁 Actions
         └─ 📃 CreatePostAction.php
      └─ 📁 Models
         └─ 📃 Post.php
         └─ 📃 Comment.php

如果 app/Http/Controllers/PostController.php 中有如下方法

public function store(Request $request)
{
    $post = new Post($request->validated());
    $post->save();
}

PHPStan 将失败并显示

 ---------------------------------------------------------------------------
  app/Http/Controllers/PostController.php
 ---------------------------------------------------------------------------
  Calling 'save' on 'App\Models\Post' outside of its Domain is not allowed.
 ---------------------------------------------------------------------------

为了修复这个错误,您应该在控制器内部直接调用 save,而是在 Post 领域(或一个 PostService 类)内部创建一个动作,并使用这个类来创建和持久化模型。

此包还将检测

  • 模型属性修改,如:$post->title = 'My title';
  • 将数据持久化到数据库的方法,如 saveupdatedelete 等,
  • 持久化数据的静态方法,如 ::create()::updateOrCreate() 等。

安装

要使用此扩展,请在 Composer 中引入它

composer require --dev juampi92/phpstan-eloquent-bounded-context

如果您还安装了 phpstan/extension-installer,则设置完成!

手动安装

如果您不想使用 phpstan/extension-installer,请将 extension.neon 包含在项目 PHPStan 配置中

includes:
    - vendor/juampi92/phpstan-eloquent-bounded-context/extension.neon

配置

无配置

如果您的模型位于其领域文件夹中,该包将知道它们没有使用 Laravel 的默认文件夹,并假设领域为 App/Domains/Posts。该领域中的任何类都可以修改 Eloquent 模型。

📁 app
├─ 📁 Domains
│  └─ 📁 Posts
│  |  └─ 📁 Actions
│  |  └─ 📁 Repositories
│  |  └─ 📁 Models ✅
│  |     └─ 📃 Post.php
│  |     └─ 📃 Comment.php
│  └─ 📁 Users
│     └─  ...
└── ...

手动配置

如果您的模型位于 App\Models 中,那么您将必须手动配置您的领域。为此,您必须首先创建一个配置文件,其中包含有关模型和领域的信息

domains:
  -
    namespace: App\Domain\Posts
    models:
      - App\Models\Post
      - App\Models\Comment
  -
    namespace: App\Domain\Users
    models:
      - App\Models\User
      - App\Models\UserProfile

然后您必须在 phpstan.neon.dist 配置中引用此文件

parameters:
	eloquentBoundedContextConfigFiles:
	    - app/Domain/domains.yml

配置忽略的命名空间

您可能想要忽略一些命名空间并允许在此处修改模型。

parameters:
	eloquentBoundedContextConfigFiles:
		- app/Domain/domains.yml
	eloquentBoundedContextIgnoredNamespaces:
		- Database\Factories
		- Tests

贡献

待办功能

  • 当使用配置时忽略无配置解析。
  • 建议使用 /** @mutates */ 标签或 #Attribute 来禁止在领域外部调用这些方法。

测试

./vendor/bin/phpunit

鸣谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件