1.3. 资源 - 快速入门
面板生成器 - 资源 - 入门
概览
资源是静态类,用于为 Eloquent 模型构建 CRUD 接口。它们描述了管理员应如何使用表格和表单与应用程序中的数据进行交互。
创建资源
为 App\Models\Customer
模型创建资源:
php artisan make:filament-resource Customer
这将在 app/Filament/Resources
目录中创建多个文件:
.
+-- CustomerResource.php
+-- CustomerResource
| +-- Pages
| | +-- CreateCustomer.php
| | +-- EditCustomer.php
| | +-- ListCustomers.php
您的新资源类位于 CustomerResource.php
。
页面 "目录中的类用于自定义应用程序中与资源交互的页面。它们都是全页面Livewire组件,你可以随意定制。
您是否创建了一个资源,但它没有出现在导航菜单中?如果您有模型策略,请确保从
viewAny()
方法中返回true
。
简单(模式)资源
有时,您的模型非常简单,您只想在一个页面上管理记录,使用模式来创建、编辑和删除记录。要生成带有模式的简单资源,请执行以下操作
php artisan make:filament-resource Customer --simple
您的资源将有一个 "管理 "页面,这是一个添加了模态的列表页面。
此外,您的简单资源将没有 getRelations()
方法,因为关系管理器只显示在 "编辑 "和 "查看 "页面,而简单资源中没有这两个页面。其他内容都是一样的。
自动生成表单和表格
如果想节省时间,Filament 可以根据模型的数据库列,使用 --generate
自动为您生成 form 和 table 表格:
php artisan make:filament-resource Customer --generate
如果您的表包含 ENUM 列,我们使用的
doctrine/dbal
软件包将无法扫描您的表,并会崩溃。因此,如果您的资源包含 ENUM 列,Filament 无法为其生成模式。了解有关此问题的更多信息. 请点击跳转.
软删除
默认情况下,您无法在应用程序中与已删除的记录进行交互。如果想在资源中添加还原、强制删除和过滤已删除记录的功能,请在生成资源时使用--soft-deletes
标记:
php artisan make:filament-resource Customer --soft-deletes
想了解软删除的更多信息 请点击跳转.
生成视图页面
默认情况下,只为资源生成列表、创建和编辑页面。如果还需要[查看页面](viewing-records),请使用--view
标志:
php artisan make:filament-resource Customer --view
记录标题
可为您的资源设置一个 $recordTitleAttribute
属性,它是模型上列的名称,可用于从其他列中识别该列。
例如,这可以是博客文章的 title
或客户的 name
:
protected static ?string $recordTitleAttribute = 'name';
这对于 [全局搜索](global-search)等功能的运行是必需的。
如果只有一列是不足以识别的记录,可以指定一个 Eloquent accessor 的名称。
资源表单
资源类包含一个 form()
方法,用于在 [创建](creating-records)和 [编辑](editing-records)页面上创建表格:
use Filament\Forms;
use Filament\Forms\Form;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\TextInput::make('name')->required(),
Forms\Components\TextInput::make('email')->email()->required(),
// ...
]);
}
schema() "方法用于定义表单的结构。它是由[字段](.../.../forms/fields/getting-started#available-fields)和[布局组件](.../.../forms/layout/getting-started#available-layout-components)组成的数组,并按照它们在表单中出现的顺序排列。
请查看表单文档中的[指南](.../../forms/getting-started),了解如何使用 Filament 创建表单。
根据当前操作隐藏组件
通过表单组件的 hiddenOn()
方法,可以根据当前页面或操作动态隐藏字段。
在本例中,我们将在 "编辑 "页面隐藏 "密码 "字段:
use Livewire\Component;
Forms\Components\TextInput::make('password')
->password()
->required()
->hiddenOn('edit'),
另外,我们还有一个 visibleOn()
快捷方法,用于仅在一个页面或操作中显示字段:
use Livewire\Component;
Forms\Components\TextInput::make('password')
->password()
->required()
->visibleOn('create'),
资源表
资源类包含一个 table()
方法,用于在[列表页](listing-records)上创建表格:
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name'),
Tables\Columns\TextColumn::make('email'),
// ...
])
->filters([
Tables\Filters\Filter::make('verified')
->query(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at')),
// ...
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
查看 tables 文档,了解如何添加表格列、过滤器、操作等。
授权
对于授权,Filament 将遵守在您的应用程序中注册的任何 模型策略。使用的方法如下:
viewAny()
用于完全隐藏导航菜单中的资源,并阻止用户访问任何页面。- create()`用于控制创建新记录。
- update()`用于控制编辑记录。
view()
用来控制 查看记录。delete()
用于防止删除单条记录。deleteAny()用于防止记录被批量删除。Filament 使用
deleteAny()方法是因为遍历多条记录并检查
delete()` 策略的性能并不高。forceDelete()
用于防止单条软删除记录被强制删除。forceDeleteAny()
用于防止记录被批量强制删除。Filament 使用forceDeleteAny()
方法,是因为遍历多条记录并检查forceDelete()
策略的性能不高。restore()
用于防止单条软删除记录被恢复。restoreAny()
用于防止记录被批量恢复。Filament 使用restoreAny()
方法,因为遍历多条记录并检查restore()
策略不是很有效。- reorder()`用于控制对记录重新排序。
跳过授权
如果想跳过资源的授权,可将 $shouldSkipAuthorization
属性设置为 true
:
protected static bool $shouldSkipAuthorization = true;
自定义模型标签
每个资源都有一个根据模型名称自动生成的 "模型标签"。例如,一个 App\Models\Customer
模型将有一个 customer
标签。
该标签用于用户界面的多个部分,您可以使用 $modelLabel
属性对其进行自定义:
protected static ?string $modelLabel = 'cliente';
或者,您也可以使用 getModelLabel()
来定义动态标签:
public static function getModelLabel(): string
{
return __('filament/resources/customer.label');
}
自定义复数模型标签
资源还有一个 "复数模型标签",由模型标签自动生成。例如,"customer "标签将被复数化为 "customers"。
您可以使用 $pluralModelLabel
属性自定义复数版本的标签:
protected static ?string $pluralModelLabel = 'clientes';
或者,您也可以在 getPluralModelLabel()
方法中设置动态复数标签:
public static function getPluralModelLabel(): string
{
return __('filament/resources/customer.plural_label');
}
资源导航项目
Filament 会使用 [plural label](#plural-label)自动为您的资源生成导航菜单项。
如果您想自定义导航项标签,可以使用 $navigationLabel
属性:
protected static ?string $navigationLabel = 'Mis Clientes';
或者,也可以在 "getNavigationLabel() "方法中设置动态导航标签:
public static function getNavigationLabel(): string
{
return __('filament/resources/customer.navigation_label');
}
设置资源导航图标
$navigationIcon
属性支持任何 Blade 组件的名称。默认情况下会安装 Heroicons。不过,如果您愿意,也可以创建自己的自定义图标组件或安装其他库。
protected static ?string $navigationIcon = 'heroicon-o-user-group';
或者,也可以在 getNavigationIcon()
方法中设置动态导航图标:
public static function getNavigationIcon(): ?string
{
return 'heroicon-o-user-group';
}
排序资源导航项目
通过 $navigationSort
属性,您可以指定导航项的排列顺序:
protected static ?int $navigationSort = 2;
或者,也可以在getNavigationSort()
方法中设置动态导航项顺序:
public static function getNavigationSort(): ?int
{
return 2;
}
分组资源导航项目
可以通过指定 $navigationGroup
属性对导航项进行分组:
protected static ?string $navigationGroup = 'Shop';
或者,也可以使用 getNavigationGroup()
方法来设置动态组标签:
public static function getNavigationGroup(): ?string
{
return __('filament/navigation.groups.shop');
}
生成资源页面的 URL
Filament 为资源类提供了 getUrl()
静态方法,用于生成资源和其中特定页面的 URL。传统上,你需要手动或使用 Laravel 的 route()
助手来构建 URL,但这些方法依赖于对资源的 slug 或路由命名约定的了解。
getUrl()
方法不带任何参数,将生成指向资源的 List 页面的 URL:
use App\Filament\Resources\CustomerResource;
CustomerResource::getUrl(); // /admin/customers
您还可以在资源中生成指向特定页面的 URL。每个页面的名称是资源的 getPages()
数组中的数组键。例如,要生成指向创建页面的 URL:
use App\Filament\Resources\CustomerResource;
CustomerResource::getUrl('create'); // /admin/customers/create
在getPages()
方法中,有些页面使用了像record
这样的 URL 参数。要生成指向这些页面的 URL 并输入记录,应使用第二个参数:
use App\Filament\Resources\CustomerResource;
CustomerResource::getUrl('edit', ['record' => $customer]); // /admin/customers/edit/1
在本例中,$customer
可以是一个 Eloquent 模型对象,也可以是一个 ID。
如果应用程序中有多个面板,getUrl()
将在当前面板中生成一个 URL。您还可以通过向 panel
参数传递面板 ID 来指明资源与哪个面板相关联:
use App\Filament\Resources\CustomerResource;
CustomerResource::getUrl(panel: 'marketing');
自定义资源 Eloquent 查询
在 Filament 中,对资源模型的每次查询都将以 getEloquentQuery()
方法开始。
因此,应用自己的查询约束或影响整个资源的模型作用域非常容易:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()->where('is_active', true);
}
禁用全局作用域
默认情况下,Filament 会观察所有注册到您的模型的全局作用域。然而,如果您想访问软删除记录等,这可能并不理想。
为了解决这个问题,你可以覆盖 Filament 使用的 getEloquentQuery()
方法:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()->withoutGlobalScopes();
}
或者,您也可以删除特定的全局作用域:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()->withoutGlobalScopes([ActiveScope::class]);
}
有关移除全局作用域的更多信息,请参阅 Laravel 文档。
自定义资源 URL
默认情况下,Filament 会根据资源名称生成 URL。您可以通过设置资源的 $slug
属性来自定义 URL:
protected static ?string $slug = 'pending-orders';
删除资源页面
如果要删除资源中的某个页面,只需删除资源的 Pages
目录中的页面文件,并删除其在 getPages()
方法中的条目即可。
例如,您可能有一个资源,其中的记录可能不是由任何人创建的。删除 Create
页面文件,然后从 getPages()
中删除它:
public static function getPages(): array
{
return [
'index' => Pages\ListCustomers::route('/'),
'edit' => Pages\EditCustomer::route('/{record}/edit'),
];
}
删除页面不会删除链接到该页面的任何操作。任何操作都将打开一个模态,而不是将用户发送到不存在的页面。例如,列表页面上的 "创建操作"、表格或视图页面上的 "编辑操作 "或表格或编辑页面上的 "查看操作"。如果要删除这些按钮,必须同时删除这些操作。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: