在我基于livewire的Laravel 8 Jetstream安装中,我有一个列出一些记录的组件。
这些记录可以在前端根据一些标准进行实时过滤,并进行实时更新和分页。
没有什么特别的,一切都像预期的那样。
现在,我需要实现一个export()
方法,它将导出过滤的数据,我不知道如何或甚至不确定是否可以从render()
方法访问数据变量,所以我只能使用过滤的数据进行导出。
Pages
分量
public $type;
public $color;
public function export() {
$dataToExport = 'here I need the filtered data from $pages variables from render method so I can export them';
}
public function render() {
$pages = Page::when($this->type, function($query) {
$query->where('type', $this->type);
})
->when($this->color, function($query) {
$query->where('color', $this->color);
})
...
->paginate();
return view('livewire.page.index', [
'pages' => $pages
]);
}
我使用render()
方法通过查询数据库来准备数据,因为当我在前端更改某些内容时,它会呈现和输出正确的数据。
基本上,一切工作正常,但在前端我有一个按钮,将触发export
方法,所以过滤的数据必须是可用的方法导出。
我选择这种方法还因为我认为不将数据暴露在公共属性中更安全。也许我没有使用最好的方法,所以我愿意采用更好的解决方案,同时兼顾性能和安全性。
BTW:在render()
方法中使用变量和使用属性有什么区别(在安全性和/或性能方面)?
在渲染或公共属性上使用数据在性能或安全性方面没有显著差异,这两种方法都会将数据暴露给javascript。如果你正在处理敏感数据,我不建议使用Livewire。
从你的代码,我认为你可以得到相同的查询使用一个函数:
public $type;
public $color;
public function export() {
$dataToExport = $this->pages()->someWayOfExportTheFilteredData();
}
public function render() {
return view('livewire.page.index', [
'pages' => $this->pages()->paginate()
]);
}
protected function pages()
{
return Page::when($this->type, function($query) {
$query->where('type', $this->type);
})
->when($this->color, function($query) {
$query->where('color', $this->color);
})
...
}