关系管理器 和 关系页面 为您提供了一种简单的方式,可以在资源内部渲染相关记录的表格。
例如,在 CourseResource 中,您可能有一个关系管理器或页面,用于管理属于该课程的 lessons。您可以从表中创建和编辑 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 会询问您是否希望每个表格行链接到一个资源,而不是打开一个模态框,对此您应该回答“是”,并选择您刚刚创建的嵌套资源。
生成关系管理器或页面后,它将具有一个指向嵌套资源的属性:
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 中标识它。例如,?relation=0 在 URL 中可能代表一个关系管理器,而 ?relation=1 可能代表另一个。
当从嵌套资源重定向回关系管理器时,Filament 会假定关系名称用于在 URL 中标识该关系管理器。例如,如果您有一个嵌套的 LessonResource 和一个 LessonsRelationManager,关系名称是 lessons,并且应在注册该关系管理器时将其用作 URL 参数键:
public static function getRelations(): array
{
return [
'lessons' => LessonsRelationManager::class,
];
}