Skip to content

模块约定

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。