juampi92 / phpstan-eloquent-bounded-context
PHPStan 规则,确保您的模型仅在其领域内部被修改。
v1.1
2022-09-26 22:59 UTC
Requires
- php: ^7.4|^8.0|^8.1
- ext-json: *
- illuminate/database: ^7.0|^8.40|^9.0
- illuminate/support: ^7.0|^8.0|^9.0
- phpstan/phpstan: ^1.0
- symfony/yaml: ^5.0|^6.0
Requires (Dev)
- phpunit/phpunit: ^9.4
README
一组 PHPStan 规则,确保您的模型仅在其领域内部被修改。
描述
这些规则将检测您的 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';
, - 将数据持久化到数据库的方法,如
save
、update
、delete
等, - 持久化数据的静态方法,如
::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)。有关更多信息,请参阅 许可证文件。