Skip to content
全部文档

在 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/actions
  • filament/schemas
  • filament/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'),
            // ...
        ]);
}