Laravel 11现有API集成Filament,自定义CRUD对接API端点
对接现有API实现Filament视图集成(Laravel 11 + Filament)
1. 创建Filament资源(跳过默认模型绑定)
先创建教师资源,无需依赖Eloquent的CRUD逻辑:
php artisan make:filament-resource Teacher --eloquent=false
如果已经创建了带模型的资源,直接修改后续方法即可。
2. 自定义列表页数据(对接API获取列表)
在app/Filament/Resources/TeacherResource.php的table()方法中,替换默认数据源为API请求:
use Illuminate\Support\Facades\Http; public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id')->label('ID'), TextColumn::make('name')->label('姓名'), TextColumn::make('email')->label('邮箱'), // 根据API返回字段添加其他列 ]) ->data(function () { // 调用现有API获取列表数据 $response = Http::get(route('teachers.index')); return $response->json(); // 假设API返回数组格式的教师列表 }); }
如果需要分页,在API端处理分页逻辑后,在Filament中配置:
->data(function (Table $table) { $page = $table->getPage(); $perPage = $table->getRecordsPerPage(); $response = Http::get(route('teachers.index'), [ 'page' => $page, 'per_page' => $perPage, ]); $data = $response->json(); // 设置总记录数用于分页渲染 $table->setTotalRecords($data['meta']['total']); return $data['data']; }) ->paginationPageOptions([10, 25, 50])
3. 自定义创建表单提交(对接POST API)
修改创建页面app/Filament/Resources/TeacherResource/Pages/CreateTeacher.php,重写handleRecordCreation方法:
use Illuminate\Support\Facades\Http; protected function handleRecordCreation(array $data): void { // 调用POST API提交表单数据 $response = Http::post(route('teachers.store'), $data); // 处理API错误响应 if ($response->failed()) { throw new \Exception($response->json('message', '创建失败')); } // 创建成功后跳转至列表页 $this->redirect( static::getResource()::getUrl('index'), navigate: true ); }
同时在TeacherResource的form()方法中定义匹配API参数的表单字段:
public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required()->label('姓名'), TextInput::make('email')->email()->required()->label('邮箱'), // 其他字段与API接收参数一致 ]); }
4. 自定义编辑表单提交(对接PUT API)
修改编辑页面app/Filament/Resources/TeacherResource/Pages/EditTeacher.php,先重写getRecord()拉取单条数据,再重写handleRecordUpdate处理更新:
use Illuminate\Support\Facades\Http; // 从API获取要编辑的教师数据 protected function getRecord($key): array { $response = Http::get(route('teachers.show', $key)); return $response->json(); } // 提交更新请求到API protected function handleRecordUpdate(array $data): void { $teacherId = $this->record['id']; $response = Http::put(route('teachers.update', $teacherId), $data); if ($response->failed()) { throw new \Exception($response->json('message', '更新失败')); } $this->redirect( static::getResource()::getUrl('index'), navigate: true ); }
5. 自定义删除逻辑(可选)
在列表页添加删除按钮,并对接DELETE API:
// 在table()方法的actions中添加 ->actions([ Tables\Actions\EditAction::make(), Tables\Actions\Action::make('delete') ->label('删除') ->color('danger') ->requiresConfirmation() ->action(function ($record) { $response = Http::delete(route('teachers.destroy', $record['id'])); if ($response->failed()) { throw new \Exception($response->json('message', '删除失败')); } }) ])
6. 路由冲突规避(可选)
如果Filament资源路由和API路由冲突,在TeacherResource中自定义路由前缀:
public static function getRoutePrefix(): string { return 'admin/teachers'; // 避免和API的/teachers路由冲突 }
关键注意事项
- 确保API返回的数据格式与Filament组件预期一致(列表为数组、单条数据为关联数组)。
- 若API需要认证,可在Http请求中携带凭证:
Http::withToken(auth()->user()->api_token)->post(...);
同域会话认证场景下,Filament请求会自动携带Session,无需额外处理。
内容的提问来源于stack exchange,提问作者AGK
相关产品推荐
相关产品推荐

