外观
模块约定
Pin 使用 Pin\Module\ModuleInspector 从类名推导模块、领域、控制器、模型、工厂和 Action。路由枚举、服务层和测试工具都会复用这些约定。
核心入口
php
use Pin\Module\ModuleInspector;
$info = ModuleInspector::make(App\Routes\User\UserRoute::class)->toArray();返回结构包含:
php
[
'basename' => 'UserRoute',
'parts' => ['App', 'Routes', 'User', 'UserRoute'],
'module' => ['name' => 'User', 'namespace' => 'App\\Modules\\User'],
'domain' => 'User',
'controller' => 'App\\Modules\\User\\UserController',
'model' => 'App\\Models\\User',
'factory' => 'App\\Factories\\UserFactory',
]实际值会根据类名位置和现有类候选自动调整。
控制器候选
当路由属于模块命名空间时,控制器候选从具体到通用依次为:
| 候选 | 示例 |
|---|---|
| 模块根控制器 | App\Modules\Product\ProductController |
| 模块领域控制器 | App\Modules\Product\Category\CategoryController |
非模块路由会回退到:
| 候选 | 示例 |
|---|---|
| 独立模块控制器 | App\Modules\Login\LoginController |
| Laravel 默认控制器 | App\Http\Controllers\LoginController |
模型候选
模块路由会按以下顺序查找模型:
text
App\Modules\Product\Models\Category
App\Models\Product\Category
App\Models\Product\ProductCategory
App\Models\ProductCategory
App\Models\Category没有模块命名空间时直接使用 App\Models\{Domain}。
Action 候选
给定 Create 路由和 Product 模块,Action 候选包括:
text
App\Modules\Product\Actions\CreateProductAction
App\Modules\Product\Actions\CreateAction
App\Modules\Product\Category\Actions\CreateCategoryAction
App\Modules\Product\Category\Actions\CreateAction这使路由测试和业务 Action 可以在不同粒度之间切换,而不用每个路由都手写类名。
与路由枚举配合
默认路由处理器来自当前路由 case 名:
php
enum UserRoute: string implements Routable
{
use InteractsWithRoute;
case Create = 'POST:/api/users';
}Create 会默认指向:
php
[App\Modules\User\UserController::class, 'create']如果不想使用约定,可以在注册时显式传入 handler,或用 #[Action] 给测试 DSL 指定 Action。