miguilim/filament-auto-panel

在执行时像魔法一样构建您的 Filament 面板资源和关系管理器。

2.0.1 2024-06-11 08:42 UTC

README

Filament Auto Panel art

Filament Auto Panel

Latest Version on Packagist Total Downloads

在执行时像魔法一样构建您的 Filament 面板资源和关系管理器。此包提供自定义资源和关系管理器类,通过扫描数据库当前表模式来在执行时挂载表、创建、查看和编辑页面,同时仍然允许您创建操作、小部件和针对面板的各种自定义。

重要

此包旨在用于管理面板,类似于 Laravel Nova 的工作方式 + 自动生成所有内容。您也可以将其视为数据库管理工具。如果您觉得需要更定制的资源工作流程,请重新考虑不要使用此包。

内容

安装

您可以通过 composer 安装此包

composer require miguilim/filament-auto-panel

使用

在开始使用此包之前,您必须了解表模式读取器的某些行为。该包考虑了数据库中的实际表模式,而不是迁移文件。然而,使用正确的字段在迁移中生成正确的列非常重要。

例如,当您使用 boolean() 列方法时,Laravel 将生成 tinyint(1) 表列。此特定列类型和长度将由 Filament Auto Panel 用于检测其是否为布尔列。如果您使用 tinyInteger() 方法,它将生成 tinyint(4) 表列,因此将被识别为数值列,即使在其上下文中它被用作布尔值。

注意

您可以通过在模型类中设置列的转换来覆盖此自动检测行为。

软删除

该包通过检查模型中是否存在 SoftDeletes 特性以及是否存在 getDeletedAtColumn 方法来检测表是否有软删除。如果检测到软删除,它将在表过滤器中附加 TrashedFilter

主键

Filament Auto Panel 尝试通过从资源/关系管理器模型中调用 getKeyName() 方法来检测主键。默认情况下,主键是可搜索的,它还将被复制到表格和清单视图中。

关系链接

该包尝试将任何以 _id 结尾的列与 belongsTo 关系链接。它为创建/编辑操作设置可搜索的 Select,并在表格和清单中链接到相应的资源(如果资源存在)的 URL。

注意

此链接目前不支持 morphsTo 检测。欢迎 PRs!

侵入模式

Auto Resources 和 Auto Relation Managers 默认启用侵入模式。当此模式激活时,创建和编辑操作将不会尊重模型的 $fillable$hidden 属性。如果您想禁用此行为,可以在资源或关系管理器类中设置 protected static bool $intrusive = false;

默认页面

默认情况下,Auto Resources 包含列表和查看页面。创建和编辑记录分别以模态操作的形式在列表和查看页面中可用。

默认操作

默认情况下,Auto Resource 会附加以下默认操作

  • 批量操作:DeleteBulkAction 或 RestoreBulkAction,ForceDeleteBulkAction
  • 表格操作:ViewAction 或 RestoreAction
  • 列表页面操作:CreateAction
  • 查看页面操作:EditAction、DeleteAction 或 RestoreAction、ForceDeleteAction

并且 Auto Relation Manager 附加以下默认操作

  • 批量操作:DeleteBulkAction 或 RestoreBulkAction,ForceDeleteBulkAction
  • 表格操作:ViewAction、EditAction 或 RestoreAction
  • 表头操作:CreateAction

默认排序

默认情况下,Auto Resource 和 Auto Relation Manager 尝试为以下列设置表格默认排序,按优先级顺序分别为:主键(仅当自增时)created_at(如果存在)updated_at(如果存在)

注意

您可以通过扩展 table(Table $table) 并使用 parent::table($table)->defaultSort(...) 来自定义表的 defaultSort() 方法(以及任何其他方法)。

自动资源

您可以通过以下命令开始使用 Auto Resource

php artisan make:filament-auto-resource

此命令为您创建 Auto Resource 类,就像默认的 filament 命令一样。但是,它使用 AutoResource 类。现在您不需要列出任何内容,您可以直接访问资源页面并看到魔法!

自动关系管理器

Auto Relation Manager 构建一个包含所有关系模型列的表格,排除相关 id 或 morph。您可以使用以下命令生成您的 Auto Relation Manager

php artisan make:filament-auto-relation-manager

此命令为您创建 Auto Relation Manager,您必须在资源的 getRelations() 方法中列出它。然而,有时您可能需要更方便的方法。您可以在资源中使用 RelationManagerMounter 创建关系管理器。请参见以下示例了解其工作原理

use Miguilim\FilamentAutoPanel\Mounters\RelationManagerMounter;

public static function getRelations(): array
{
    return [
        RelationManagerMounter::make(
            resource: static::class,
            relation: 'userBans',
            recordTitleAttribute: 'Bans',
            visibleColumns: ['reason', 'created_at'],
        ),
    ];
}

自动操作

Auto Resource 和 Auto Relation Manager 提供了 getActions() 方法,但是您不能在它上面使用默认的 Filament 操作。

相反,您必须使用 AutoAction 类。此操作类型具有与 Filament Actions 相同的方法,但它提供了设置操作将显示位置的新方法。由于只有一个数组用于所有资源操作位置,因此这是必需的。

资源 action 闭包始终接收一个模型集合。以下是如何工作的示例

use Miguilim\FilamentAutoPanel\AutoAction;
use Illuminate\Database\Eloquent\Collection;

public static function getActions(): array
{
    return [
        AutoAction::make('refund')
            ->label('Refund')
            ->icon('heroicon-o-arrow-path')
            ->color('danger')
            ->action(fn (Collection $records) => $records->each->refund())
            ->showOnTable()
            ->showOnViewPage(),
    ];
}

注意

默认情况下,自动操作不会在任何地方显示,因此您必须设置以下方法之一:showOnTable()showOnBulkAction()showOnViewPage()

枚举字典

枚举字典是可用于帮助您格式化资源列值的特性。此功能在表格和 infolist 中设置 badge(),并在表单中使用 Select 显示您设置的值。您可以使用以下方式使用它

protected static array $enumDictionary = [
    'type' => [
        0 => 'Default',
        1 => 'Administrator',
    ]
];

您可以使用以下语法自定义徽章颜色

protected static array $enumDictionary = [
    'type' => [
        0 => ['Default', 'blue'],
        1 => ['Administrator', 'red'],
    ]
];

可见列

默认情况下,所有列都在 Auto Resource 或 Auto Relation Manager 表中显示。您可以使用以下方式自定义列的可见性

protected static array $visibleColumns = [
    'name', 'email', 'created_at'
];

此功能仅设置列的默认可见性在表格右上角的菜单中。您可以使用面板在任何时候启用/禁用任何列的可见性。

注意

您不能自定义表单或 infolist 列的可见性。

可搜索列

您可以使用以下方式为您的 Auto Resource 或 Auto Relation Manager 设置可搜索的列

protected static array $searchableColumns = [
    'name'  => 'global',
    'email' => 'global',
];

您有以下可搜索选项可供使用:globalindividualboth

覆盖列

有时您可能想要完全自定义资源列,您可以通过 getColumnsOverwrite 方法覆盖表列、表单字段或 infolist 条目。

use Filament\Tables\Columns\ImageColumn;

public static function getColumnsOverwrite(): array
{
    return [
        'table' => [
            ImageColumn::make('profile_photo_url')
                ->label('Profile Photo')
        ],
        'form' => [
            //
        ],
        'infolist' => [
            //
        ],
    ];
}

注意

您不能使用此方法添加新列,只能覆盖检测到的列。`make()` 参数名称必须与数据库中的列名称相同。

小部件

您可以通过以下方式独立地为您的自动资源设置 listview 页面的小部件

public static function getHeaderWidgets(): array
{
    return [
        'list' => [
            MyCoolStatsWidget::class,
        ],
        'view' => [
            //
        ],
    ];
}

public static function getFooterWidgets(): array
{
    return [
        'list' => [
            //
        ],
        'view' => [
            //
        ],
    ];
}

额外页面

您可以使用 getExtraPages 方法为您的自动资源添加额外页面

public static function getExtraPages(): array
{
    return [
        MyCustomResourcePage::route('/custom-path'),
    ];
}

许可证

丝状自动面板是开源软件,采用 MIT 许可证