Clusters
概述
Cluster 是面板中的分层结构,允许你将资源和自定义页面分组在一起。它们有助于将面板组织成逻辑部分,并有助于减少面板侧边栏的大小。
使用 Cluster 时,会发生以下几件事:
- 一个新的导航项被添加到导航中,它是指向 Cluster 中第一个资源或页面的链接。
- 资源或页面的各个导航项在主导航中不再可见。
- 新的子导航 UI 将添加到 Cluster 中的每个资源或页面,其中包含 Cluster 中资源或页面的导航项。
- Cluster 中的资源和页面会得到一个新的 URL,前缀是 Cluster 的名称。如果你正确生成资源和页面的 URL,则应自动处理此更改。
- Cluster 的名称位于 Cluster 中所有资源和页面的面包屑中。单击它时,你将被带到 Cluster 中的第一个资源或页面。
创建 Cluster
在创建第一个 Cluster 之前,必须告诉面板 Cluster 类的位置。除了配置中的 discoverResources()
和 discoverPages()
等方法外,还可以使用 discoverClusters()
:
public function panel(Panel $panel): Panel
{
return $panel
// ...
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\\Filament\\Clusters');
}
现在,你可以使用 php artisan make:filament-cluster
创建 Cluster 了:
php artisan make:filament-cluster Settings
这将会在 app/Filament/Cluster
目录中创建一个新的 Cluster 类:
<?php
namespace App\Filament\Clusters;
use Filament\Clusters\Cluster;
class Settings extends Cluster
{
protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';
}
默认情况下,会定义 $navigationIcon
属性,因为你很可能希望立即对其进行自定义。所有其他导航属性和方法也可使用,包括 $navigationLabel
、$navigationSort
和 $avigationGroup
。它们用于自定义 Cluster 的主导航项,与为资源或页面自定义该导航项一样。
将资源和页面添加到 Cluster
要将资源和页面添加到 Cluster,你只需在资源或页面类中定义 $cluster
属性,并将其设置为你创建的 Cluster 类:
use App\Filament\Clusters\Settings;
protected static ?string $cluster = Settings::class;
使用 Cluster 的面板的代码结构推荐
使用 Cluster 时,推荐将所有资源和页面移到与 Cluster 同名的目录。比如,此处是一个使用名为 Settings
的 Cluster 的面板,其中包含一个 ColorResource
和两个自定义页面,其目录结构如下:
.
+-- Clusters
| +-- Settings.php
| +-- Settings
| | +-- Pages
| | | +-- ManageBranding.php
| | | +-- ManageNotifications.php
| | +-- Resources
| | | +-- ColorResource.php
| | | +-- ColorResource
| | | | +-- Pages
| | | | | +-- CreateColor.php
| | | | | +-- EditColor.php
| | | | | +-- ListColors.php
这只是推荐,并非强制。只要 Cluster 中的资源和页面使用 $cluster
属性,就可以随心所欲地构建面板。这只是一个建议,可以帮助你保持面板井然有序。
当面板中存在 Cluster,并且使用 make:filament-resource
或 make:filament-page
命令生成新的资源或页面时,系统会询问你是否要根据这些准则在集群目录中创建这些资源或页面。如果选择了,Filament 还会为资源或页面类分配正确的 $cluster
属性。如果没有这样做,你将需要自己定义 $cluster
属性。