novius/laravel-filament-publishable
Filament integration for models using novius/laravel-publishable. Adds publishable form fields (status, published/expired dates), table column, status filter, and bulk action to Filament resources. Supports Laravel 11+, Filament 4+, PHP 8.2+.
Install the Package Run:
composer require novius/laravel-filament-publishable
Ensure your project meets requirements: Laravel 11+, Filament 4+, and PHP 8.2+.
Ensure Models Use Publishable Trait
Add the trait to your model (e.g., Post):
use Novius\Publishable\Traits\Publishable;
class Post extends Model
{
use Publishable;
// ...
}
Integrate into a Filament Resource
Add publishable fields to your resource’s form() method:
use Novius\LaravelFilamentPublishable\Fields\PublicationStatus;
use Novius\LaravelFilamentPublishable\Fields\PublishedAt;
use Novius\LaravelFilamentPublishable\Fields\ExpiredAt;
public static function form(Form $form): Form
{
return $form->schema([
PublicationStatus::make('publication_status'),
PublishedAt::make('published_at'),
ExpiredAt::make('expired_at'),
// ... other fields
]);
}
Add Table Column and Filters
Include the publishable column and filter in your resource’s table() method:
use Novius\LaravelFilamentPublishable\Columns\PublicationColumn;
use Novius\LaravelFilamentPublishable\Filters\PublicationStatusFilter;
public static function table(Table $table): Table
{
return $table
->columns([
PublicationColumn::make('publication_status'),
// ... other columns
])
->filters([
PublicationStatusFilter::make('publication_status'),
// ... other filters
]);
}
Enable Bulk Actions (Optional) Add the bulk action to your table:
use Novius\LaravelFilamentPublishable\Actions\PublicationBulkAction;
public static function table(Table $table): Table
{
return $table
->actions([
PublicationBulkAction::make(),
// ... other actions
]);
}
Publish Language Files (If Needed) Customize translations by publishing the lang files:
php artisan vendor:publish --provider="Novius\LaravelFilamentPublishable\LaravelFilamentPublishableServiceProvider" --tag="lang"
Publish a Blog Post
PostResource with publishable fields.PublicationStatus field to toggle between draft, published, and expired.published_at and expired_at dates.PublicationColumn.Replace manual status/date fields with publishable fields for consistency:
// Before (manual)
Select::make('status')
->options(['draft', 'published', 'expired'])
->required(),
// After (publishable)
PublicationStatus::make('publication_status'),
PublishedAt::make('published_at'),
ExpiredAt::make('expired_at'),
Show/hide fields based on the publication status using Filament’s visible modifier:
PublishedAt::make('published_at')
->visible(fn ($record) => $record->publication_status !== 'draft'),
Override default labels/placeholders:
PublicationStatus::make('publication_status')
->label('Content Status')
->placeholder('Select status'),
Customize the PublicationColumn to display icons or badges:
PublicationColumn::make('publication_status')
->badge()
->colors([
'draft' => 'info',
'published' => 'success',
'expired' => 'danger',
]),
Use the PublicationStatusFilter to let users filter records:
PublicationStatusFilter::make('publication_status')
->label('Filter by Status'),
Add the bulk action to publish/unpublish multiple records:
PublicationBulkAction::make()
->label('Update Publication Status'),
Trigger custom logic when records are published/expired:
use Filament\Actions\Action;
Action::make('notifyOnPublish')
->action(function (Post $record) {
// Send notification when published
Notification::send($record->author, new PostPublished($record));
})
->visible(fn ($record) => $record->publication_status === 'published'),
publication_status = 'draft'.published and sets published_at.expired_at to hide the post later.PublicationStatusFilter to view only published or expired posts.PublicationBulkAction to publish/unpublish multiple posts at once.published_at to a future date.publication_status to published when the date arrives.Combine with Filament’s localization features:
use Filament\Resources\Resource;
use Novius\LaravelFilamentPublishable\Fields\PublishedAt;
class LocalizedPost extends Resource
{
public static function form(Form $form): Form
{
return $form->schema([
PublishedAt::make('published_at'),
// ... other localized fields
]);
}
}
Seed publishable models with default states:
Post::factory()->create([
'publication_status' => 'draft',
'published_at' => null,
'expired_at' => null,
]);
Listen for publishable state changes:
class PostObserver
{
public function saved(Post $post)
{
if ($post->wasChanged('publication_status')) {
// Trigger custom logic (e.g., notifications, cache updates)
}
}
}
Expose publishable fields in API responses:
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'publication_status' => $this->publication_status,
'published_at' => $this->published_at,
// ...
];
}
Test publishable workflows in PHPUnit:
public function test_publish_post()
{
$post = Post::factory()->create(['publication_status' => 'draft']);
$this->actingAs($user)
->put("/admin/resources/posts/{$post->id}", [
'publication_status' => 'published',
'published_at' => now(),
]);
$this->assertEquals('published', $post->fresh()->publication_status);
}
Add validation rules for publishable fields:
public static function form(Form $form): Form
{
return $form->schema([
PublicationStatus::make('publication_status')
->rules([
Rule::required(),
Rule::in(['draft', 'published', 'expired']),
]),
PublishedAt::make('published_at')
->requiredIf(fn ($record) => $record->publication_status === 'published'),
]);
}
Publishable TraitPublicationStatus will fail if the model lacks the Publishable trait.use Novius\Publishable\Traits\Publishable;
publication_status, published_at, expired_at). Custom column names may break functionality.How can I help you explore Laravel packages today?