编辑记录

Resources

填充表单前自定义数据

你可能想要在记录填充到表单前修改数据。你可以通过定义 mutateFormDataBeforeFill() 方法去修改 $data 数组,在填充到表单前返回修改后的版本:

protected function mutateFormDataBeforeFill(array $data): array
{
$data['user_id'] = auth()->id();
 
return $data;
}

保存前自定义数据

有时,你需要在最终保存到数据库之前修改表单数据。你可以定义 mutateFormDataBeforeSave() 方法,使其接收 $data 数组作为参数,并返回修改过的版本:

protected function mutateFormDataBeforeSave(array $data): array
{
$data['last_edited_by_id'] = auth()->id();
 
return $data;
}

自定义保存过程

你可以使用 handleRecordCreation() 方法调整记录更新方式:

use Illuminate\Database\Eloquent\Model;
 
protected function handleRecordUpdate(Model $record, array $data): Model
{
$record->update($data);
 
return $record;
}

自定义表单重定向

默认情况下,表单保存后,用户不会被重定向到其他页面。

你可以重写 getRedirectUrl() 自定义表单保存后的跳转页面。

比如,表单可以跳转回列表页

protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('index');
}

或者查看页:

protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('view', ['record' => $this->record]);
}

自定义保存通知

当记录更新成功,会派送一个通知给用户,告知操作成功。

要自定义通知的文本内容:

protected function getSavedNotificationMessage(): ?string
{
return 'User updated';
}

要禁用通知:

protected function getSavedNotificationMessage(): ?string
{
return null;
}

生命周期钩子

钩子可用在页面生命周期内的各种节点中执行代码,比如表单数据保存之前。要启用钩子,在页面类中以钩子名新建一个 protected 修饰的方法:

protected function beforeSave(): void
{
// ...
}

此例中,beforeSave() 方法会在表单数据保存到数据库之前被调用。

编辑页可用的一些钩子有:

use Filament\Resources\Pages\EditRecord;
 
class EditUser extends EditRecord
{
// ...
 
protected function beforeFill(): void
{
// Runs before the form fields are populated from the database.
}
 
protected function afterFill(): void
{
// Runs after the form fields are populated from the database.
}
 
protected function beforeValidate(): void
{
// Runs before the form fields are validated when the form is saved.
}
 
protected function afterValidate(): void
{
// Runs after the form fields are validated when the form is saved.
}
 
protected function beforeSave(): void
{
// Runs before the form fields are saved to the database.
}
 
protected function afterSave(): void
{
// Runs after the form fields are saved to the database.
}
 
}

删除记录的生命周期钩子

你可以使用 before()after() 方法,在删除记录之前执行代码:

protected function getActions(): array
{
return [
DeleteAction::make()
->before(function () {
// ...
})
->after(function () {
// ...
}),
];
}

授权

关于授权,Filament 会监听所有应用中注册的模型策略

如果模型策略的 update() 方法中返回的是 true(),用户可以访问编辑页。

同时如果模型策略的 delete() 方法中返回的是 true(),用户页可以删除记录。

自定义操作

操作(Actions) 是页面上展示的按钮,用于让用户在页面中运行 Livewire 方法或者访问 URL。

在资源页面中,操作通常位于两个位置: 页面的右上角和表单下面。

比如,你可以在编辑页面的"删除"按钮旁边添加新的操作按钮,执行 impersonate() Livewire 方法:

use Filament\Pages\Actions;
use Filament\Resources\Pages\EditRecord;
 
class EditUser extends EditRecord
{
// ...
 
protected function getActions(): array
{
return [
Actions\Action::make('impersonate')->action('impersonate'),
Actions\DeleteAction::make(),
];
}
 
public function impersonate(): void
{
// ...
}
}

或者,在表单"保存"按钮后添加新按钮:

use Filament\Pages\Actions\Action;
use Filament\Resources\Pages\EditRecord;
 
class EditUser extends EditRecord
{
// ...
 
protected function getFormActions(): array
{
return array_merge(parent::getFormActions(), [
Action::make('close')->action('saveAndClose'),
]);
}
 
public function saveAndClose(): void
{
// ...
}
}

查看所有的操作 API,请访问页面

自定义视图

要进一步自定义,你可以覆盖页面类的静态 $view 属性:

protected static string $view = 'filament.resources.users.pages.edit-user';

需要帮助? 加入论坛 或者打开 GitHub讨论

喜欢Filament?

Filament 中文文档由 laravel-filament.cn 翻译整理。站长用爱发电,希望为英文阅读不畅的朋友提供快速掌握Filament框架的途径。文档的翻译,社区的运营维护都需要时间精力上的付出。如果文档社区使你受益,如果你想支持站长...

打赏