在 Blade 视图中渲染 Infolist
WARNING
继续之前,请确认项目中已安装 filament/infolists。可通过运行以下命令检查:
bash
composer show filament/infolists若尚未安装,请参阅安装指南,并按说明配置独立组件。
设置 Livewire 组件
首先,生成一个新的 Livewire 组件:
bash
php artisan make:livewire ViewProduct然后,在页面上渲染该 Livewire 组件:
blade
@livewire('view-product')或者,你也可以使用整页 Livewire 组件:
php
use App\Livewire\ViewProduct;
use Illuminate\Support\Facades\Route;
Route::get('products/{product}', ViewProduct::class);你必须在 Livewire 组件类上使用 InteractsWithSchemas trait,并实现 HasSchemas 接口:
php
use Filament\Schemas\Concerns\InteractsWithSchemas;
use Filament\Schemas\Concerns\RestrictsFileUploadsToSchemaComponents;
use Filament\Schemas\Contracts\HasSchemas;
use Livewire\Component;
class ViewProduct extends Component implements HasSchemas
{
use InteractsWithSchemas;
use RestrictsFileUploadsToSchemaComponents;
// ...
}添加 Infolist
接下来,在 Livewire 组件中添加一个方法,接收 $infolist 对象、对其进行修改并返回:
php
use Filament\Schemas\Schema;
public function productInfolist(Schema $schema): Schema
{
return $schema
->record($this->product)
->components([
// ...
]);
}最后,在 Livewire 组件的视图中渲染该 infolist:
blade
{{ $this->productInfolist }}INFO
filament/infolists 还包含以下包:
filament/actionsfilament/schemasfilament/support
这些包允许你在 Livewire 组件中使用它们的组件。 例如,若你的 infolist 使用了 Actions,请记得在 Livewire 组件类上实现 HasActions 接口并使用 InteractsWithActions trait。
若在 infolist 中使用了其他 Filament 组件,请务必一并安装并集成对应的包。
向 Infolist 传递数据
你可以通过两种方式向 infolist 传递数据:
要么向 infolist 的 record() 方法传入 Eloquent 模型实例,以自动将所有模型属性和关系映射到 infolist schema 中的条目:
php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Schema;
public function productInfolist(Schema $schema): Schema
{
return $schema
->record($this->product)
->components([
TextEntry::make('name'),
TextEntry::make('category.name'),
// ...
]);
}或者,你可以向 infolist 的 state() 方法传入数据数组,以手动将数据映射到 infolist schema 中的条目:
php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Schema;
public function productInfolist(Schema $schema): Schema
{
return $schema
->constantState([
'name' => 'MacBook Pro',
'category' => [
'name' => 'Laptops',
],
// ...
])
->components([
TextEntry::make('name'),
TextEntry::make('category.name'),
// ...
]);
}