Filament表格小部件自动更新失效,如何实现60秒数据刷新?
问题
我通过服务调用API获取数据,希望数据每60秒更新一次。我知道小部件默认每10秒更新,但初始加载后数据似乎从未更新。我尝试添加->poll('60s'),但API从未再次被调用。
当前我的TopPages小部件代码如下:
public function table(Tables\Table $table): Tables\Table { return $table ->query(TopPage::query()) ->columns([ TextColumn::make('page') ->label('Page') ->getStateUsing(fn ($record) => $record['page']), TextColumn::make('visitors') ->label('Visitors') ->getStateUsing(fn ($record) => number_format($record['visitors'])), TextColumn::make('pageviews') ->label('Page Views') ->getStateUsing(fn ($record) => number_format($record['pageviews'])), ]); }
TopPage模型代码如下:
use Sushi; protected $rows; public function getRows(): array { $plausibleAnalyticsService = new PlausibleAnalyticsService(); $topPages = $plausibleAnalyticsService->fetchTopPages(); Log::info('TopPage model getRows method called'); return $topPages; }
解决方法
1. 正确配置表格轮询
确保->poll('60s')方法正确追加到表格的链式调用中,位置不影响功能,只要属于表格实例的链式调用即可:
public function table(Tables\Table $table): Tables\Table { return $table ->query(TopPage::query()) ->poll('60s') // 添加轮询规则 ->columns([ // 列定义保持不变 ]); }
2. 处理Sushi模型的缓存问题
你使用的Sushi包默认会缓存getRows()的返回结果,这会导致即使表格发起轮询请求,模型也不会重新调用API拉取新数据。可以通过两种方式解决:
方式一:设置缓存过期时间
在TopPage模型中添加$cacheExpiration属性,将缓存有效期设为60秒,和轮询周期对齐:
use Sushi; protected $rows; protected $cacheExpiration = 60; // 缓存60秒后自动刷新 public function getRows(): array { // 原有代码保持不变 }
方式二:强制查询时跳过缓存
如果需要彻底禁用缓存(不推荐,会增加API调用频次),可以在查询时追加->withoutCache():
// 修改小部件中的query部分 ->query(TopPage::query()->withoutCache())
3. 验证生效状态
可以通过浏览器开发者工具的Network标签,查看是否每隔60秒有新请求发送;同时观察Laravel日志中的TopPage model getRows method called条目,确认API是否被重新调用。
内容的提问来源于stack exchange,提问作者Nathan Bayne
相关产品推荐
相关产品推荐

