Skip to content
全部文档

自定义列

简介

你可以创建自己的自定义列类和视图,在项目中复用,甚至可以作为插件发布给社区。

要创建自定义列类和视图,可以使用以下命令:

bash
php artisan make:filament-table-column AudioPlayerColumn

这将创建如下组件类:

php
use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
}

同时还会在 resources/views/filament/tables/columns/audio-player-column.blade.php 创建视图文件。

INFO

Filament 表格列不是 Livewire 组件。在表格列类上定义公共属性和方法,并不会使它们在 Blade 视图中可访问。

在 Blade 视图中访问列的状态

在 Blade 视图中,你可以使用 $getState() 函数访问列的状态

blade
<div>
    {{ $getState() }}
</div>

在 Blade 视图中访问 Eloquent 记录

在 Blade 视图中,你可以使用 $record 变量访问当前表格行的 Eloquent 记录:

blade
<div>
    {{ $record->name }}
</div>

在 Blade 视图中访问当前 Livewire 组件实例

在 Blade 视图中,你可以使用 $this 访问当前 Livewire 组件实例:

blade
@php
    use Filament\Resources\Users\RelationManagers\ConferencesRelationManager;
@endphp

<div>
    @if ($this instanceof ConferencesRelationManager)
        You are editing the conferences of a user.
    @endif
</div>

在 Blade 视图中访问当前列实例

在 Blade 视图中,你可以使用 $column 访问当前列实例。你可以在此对象上调用公共方法,以访问变量中可能不可用的其他信息:

blade
<div>
    @if ($column->isLabelHidden())
        This is a new conference.
    @endif
</div>

向自定义列类添加配置方法

你可以向自定义列类添加一个公共方法,接收配置值、将其存入受保护属性,再通过另一个公共方法返回:

php
use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
    
    protected ?float $speed = null;

    public function speed(?float $speed): static
    {
        $this->speed = $speed;

        return $this;
    }

    public function getSpeed(): ?float
    {
        return $this->speed;
    }
}

现在,在自定义列的 Blade 视图中,你可以使用 $getSpeed() 函数访问 speed:

blade
<div>
    {{ $getSpeed() }}
</div>

你在自定义列类上定义的任何公共方法,都可以用这种方式在 Blade 视图中作为变量函数访问。

要将配置值传给自定义列类,可以使用该公共方法:

php
use App\Filament\Tables\Columns\AudioPlayerColumn;

AudioPlayerColumn::make('recording')
    ->speed(0.5)

在自定义列配置方法中允许工具注入

工具注入(Utility injection) 是 Filament 的强大功能,允许用户使用可访问各种工具的函数来配置组件。你可以通过确保配置的参数类型和属性类型允许用户传入 Closure 来启用工具注入。在 getter 方法中,应将配置值传给 $this->evaluate() 方法:若用户传入函数,则会向其中注入工具;若为静态值,则直接返回该值:

php
use Closure;
use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
    
    protected float | Closure | null $speed = null;

    public function speed(float | Closure | null $speed): static
    {
        $this->speed = $speed;

        return $this;
    }

    public function getSpeed(): ?float
    {
        return $this->evaluate($this->speed);
    }
}

现在,你可以向 speed() 方法传入静态值或函数,并注入任意工具作为参数:

php
use App\Filament\Tables\Columns\AudioPlayerColumn;

AudioPlayerColumn::make('recording')
    ->speed(fn (Conference $record): float => $record->isGlobal() ? 1 : 0.5)