You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:12