Version

Theme

Table Builder - Columns

Advanced columns

Table column utility injection

The vast majority of methods used to configure columns accept functions as parameters instead of hardcoded values:

use Filament\Tables\Columns\TextColumn;
 
TextColumn::make('status')
->color(fn (string $state): string => match ($state) {
'draft' => 'gray',
'reviewing' => 'warning',
'published' => 'success',
'rejected' => 'danger',
})

This alone unlocks many customization possibilities.

The package is also able to inject many utilities to use inside these functions, as parameters. All customization methods that accept functions as arguments can inject utilities.

These injected utilities require specific parameter names to be used. Otherwise, Filament doesn't know what to inject.

Injecting the current state of a column

If you wish to access the current state (value) of the column, define a $state parameter:

function ($state) {
// ...
}

Injecting the current Eloquent record

If you wish to access the current Eloquent record of the column, define a $record parameter:

use Illuminate\Database\Eloquent\Model;
 
function (Model $record) {
// ...
}

Be aware that this parameter will be null if the column is not bound to an Eloquent record. For instance, the label() method of a column will not have access to the record, as the label is not related to any table row.

Injecting the current column instance

If you wish to access the current column instance, define a $column parameter:

use Filament\Tables\Columns\Column;
 
function (Column $column) {
// ...
}

Injecting the current Livewire component instance

If you wish to access the current Livewire component instance that the table belongs to, define a $livewire parameter:

use Filament\Tables\Contracts\HasTable;
 
function (HasTable $livewire) {
// ...
}

Injecting the current table instance

If you wish to access the current table configuration instance that the column belongs to, define a $table parameter:

use Filament\Tables\Table;
 
function (Table $table) {
// ...
}

Injecting the current table row loop

If you wish to access the current Laravel Blade loop object that the column is rendered part of, define a $rowLoop parameter:

function (stdClass $rowLoop) {
// ...
}

As $rowLoop is Laravel Blade's $loop object, you can access the current row index using $rowLoop->index. Similar to $record, this parameter will be null if the column is currently being rendered outside a table row.

Injecting multiple utilities

The parameters are injected dynamically using reflection, so you are able to combine multiple parameters in any order:

use Filament\Tables\Contracts\HasTable;
use Illuminate\Database\Eloquent\Model;
 
function (HasTable $livewire, Model $record) {
// ...
}

Injecting dependencies from Laravel's container

You may inject anything from Laravel's container like normal, alongside utilities:

use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
 
function (Request $request, Model $record) {
// ...
}
Edit on GitHub

Still need help? Join our Discord community or open a GitHub discussion