簇是面板中的一种层级结构,允许您将资源和自定义页面组合在一起。它们有助于将面板组织成逻辑部分,并且可以帮助减小面板侧边栏的大小。
在使用集群时,会发生以下情况:
在创建您的第一个集群之前,您必须告知面板集群类应位于何处。除了像 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 命令创建一个集群:
php artisan make:filament-cluster Settings这将在 app/Filament/Clusters 目录中创建一个新的集群类:
<?php
namespace App\Filament\Clusters\Settings;
use BackedEnum;
use Filament\Clusters\Cluster;
use Filament\Support\Icons\Heroicon;
class SettingsCluster extends Cluster
{
protected static string | BackedEnum | null $navigationIcon = Heroicon::OutlinedSquares2x2;
}此 $navigationIcon 属性默认已定义,因为您很可能希望立即对其进行自定义。所有其他 导航属性和方法 也可用,包括 $navigationLabel, $navigationSort 和 $navigationGroup。这些用于自定义集群的主导航项,其方式与您为资源或页面自定义项的方式相同。
要将资源和页面添加到集群,您只需在资源或页面类上定义 $cluster 属性,并将其设置为 您创建的 集群类:
use App\Filament\Clusters\SettingsCluster;
protected static ?string $cluster = SettingsCluster::class;当使用集群时,建议您将所有资源和页面移动到与集群同名的目录中。例如,这是一个使用名为 Settings 的集群的面板的目录结构,其中包含一个 ColorResource 和两个自定义页面:
.
+-- Clusters
| +-- Settings
| | +-- SettingsCluster.php
| | +-- Pages
| | | +-- ManageBranding.php
| | | +-- ManageNotifications.php
| | +-- Resources
| | | +-- ColorResource.php
| | | +-- ColorResource
| | | | +-- Pages
| | | | | +-- CreateColor.php
| | | | | +-- EditColor.php
| | | | | +-- ListColors.php
这是一项建议,而非强制要求。您可以随心所欲地构建您的面板,只要您的集群中的资源和页面使用 $cluster 属性。这只是一个旨在帮助您保持面板井井有条的建议。
当您的面板中存在集群时,并且您使用 make:filament-resource 或 make:filament-page 命令生成新的资源或页面时,系统将根据这些指导原则询问您是否要在集群目录中创建它们。如果您选择这样做,那么 Filament 也会为您将正确的 $cluster 属性分配给资源或页面类。如果您不这样做,您将需要自己定义 $cluster 属性。
子导航默认在每个页面的开头渲染。它可以按页面自定义,但你也可以通过设置 $subNavigationPosition 属性来一次性为整个集群自定义它。该值可以是 SubNavigationPosition::Start, SubNavigationPosition::End, 或 SubNavigationPosition::Top 以将子导航渲染为选项卡:
use Filament\Pages\Enums\SubNavigationPosition;
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::End;集群的名称位于集群中所有资源和页面的面包屑导航中。
您可以使用集群类中的 $clusterBreadcrumb 属性来自定义面包屑名称:
protected static ?string $clusterBreadcrumb = 'cluster';或者,您可以使用 getClusterBreadcrumb() 来定义一个动态的面包屑名称:
public static function getClusterBreadcrumb(): string
{
return __('filament/clusters/cluster.name');
}