嵌套资源
概述
例如,在 CourseResource 中,你可能有一个针对属于该课程的 lessons 的关联管理器或页面。可以从表格中创建和编辑课时,并以模态对话框打开。
不过,课时可能过于复杂,不适合在模态中创建和编辑。你可能希望课时有自己的资源,从而在完整页面中创建和编辑。这就是嵌套资源。


创建嵌套资源
要创建嵌套资源,可对 make:filament-resource 命令使用 --nested 选项:
php artisan make:filament-resource Lesson --nested要创建关联管理器或页面,可使用 make:filament-relation-manager 或 make:filament-page 命令:
php artisan make:filament-relation-manager CourseResource lessons title
php artisan make:filament-page ManageCourseLessons --resource=CourseResource --type=ManageRelatedRecords创建关联管理器或页面时,Filament 会询问是否希望每行表格链接到资源而非打开模态;此时应回答「yes」,并选择刚创建的嵌套资源。
生成关联管理器或页面后,会有一个指向嵌套资源的属性:
use App\Filament\Resources\Courses\Resources\Lessons\LessonResource;
protected static ?string $relatedResource = LessonResource::class;嵌套资源类会有一个指向父资源的属性:
use App\Filament\Resources\Courses\CourseResource;
protected static ?string $parentResource = CourseResource::class;自定义关联名称
与关联管理器和页面会根据关联中的模型推断关联名称一样,嵌套资源也会如此。有时关联名不符合传统约定,你需要告知 Filament 嵌套资源正确的关联名称。
要自定义关联名称,先从嵌套资源类中移除 $parentResource 属性,然后定义 getParentResourceRegistration() 方法:
use App\Filament\Resources\Courses\CourseResource;
use Filament\Resources\ParentResourceRegistration;
public static function getParentResourceRegistration(): ?ParentResourceRegistration
{
return CourseResource::asParent()
->relationship('lessons')
->inverseRelationship('course');
}若使用默认名称,可省略对 relationship() 和 inverseRelationship() 的调用。
以正确 URL 注册关联管理器
当嵌套资源由关联管理器列出,且该页还有其他关联管理器时,从嵌套资源重定向回去时 URL 可能不正确。因为资源上注册的每个关联管理器会分配一个整数,用于在多个关联管理器之间切换时在 URL 中标识。例如,?relation=0 可能代表一个关联管理器,?relation=1 代表另一个。
从嵌套资源重定向回关联管理器时,Filament 会假定用关联名称在 URL 中标识该关联管理器。例如,若有嵌套的 LessonResource 与 LessonsRelationManager,关联名是 lessons,注册时应将其作为该关联管理器的 URL 参数键:
public static function getRelations(): array
{
return [
'lessons' => LessonsRelationManager::class,
];
}