Skip to content
全部文档

嵌套资源

概述

关联管理器关联页面 可让你方便地在资源内渲染相关记录的表格。

例如,在 CourseResource 中,你可能有一个针对属于该课程的 lessons 的关联管理器或页面。可以从表格中创建和编辑课时,并以模态对话框打开。

不过,课时可能过于复杂,不适合在模态中创建和编辑。你可能希望课时有自己的资源,从而在完整页面中创建和编辑。这就是嵌套资源。

在文章下列出评论的嵌套资源在文章下列出评论的嵌套资源

创建嵌套资源

要创建嵌套资源,可对 make:filament-resource 命令使用 --nested 选项:

bash
php artisan make:filament-resource Lesson --nested

要访问嵌套资源,还需要 关联管理器关联页面。用户可在此查看相关记录列表,并点击链接进入「创建」和「编辑」页面。

要创建关联管理器或页面,可使用 make:filament-relation-managermake:filament-page 命令:

bash
php artisan make:filament-relation-manager CourseResource lessons title

php artisan make:filament-page ManageCourseLessons --resource=CourseResource --type=ManageRelatedRecords

创建关联管理器或页面时,Filament 会询问是否希望每行表格链接到资源而非打开模态;此时应回答「yes」,并选择刚创建的嵌套资源。

生成关联管理器或页面后,会有一个指向嵌套资源的属性:

php
use App\Filament\Resources\Courses\Resources\Lessons\LessonResource;

protected static ?string $relatedResource = LessonResource::class;

嵌套资源类会有一个指向父资源的属性:

php
use App\Filament\Resources\Courses\CourseResource;

protected static ?string $parentResource = CourseResource::class;

自定义关联名称

与关联管理器和页面会根据关联中的模型推断关联名称一样,嵌套资源也会如此。有时关联名不符合传统约定,你需要告知 Filament 嵌套资源正确的关联名称。

要自定义关联名称,先从嵌套资源类中移除 $parentResource 属性,然后定义 getParentResourceRegistration() 方法:

php
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 中标识该关联管理器。例如,若有嵌套的 LessonResourceLessonsRelationManager,关联名是 lessons,注册时应将其作为该关联管理器的 URL 参数键

php
public static function getRelations(): array
{
    return [
        'lessons' => LessonsRelationManager::class,
    ];
}