novius/laravel-filament-publishable
Manage Laravel Publishable models in Filament 4: add publication status fields, columns, filters, and bulk actions to your resources for Laravel 11+ and PHP 8.2+.
Architecture fit. This is a thin UI adapter, not a standalone library. It binds Filament form/table components to the state machine and columns defined by novius/laravel-publishable (publication_status, published_at, expired_at). That's a clean separation: domain semantics live in the parent trait, presentation lives here. Architecturally it fits any Filament 4 admin panel already built on Eloquent resources, provided the parent package is the source of publication truth. If the team hasn't committed to novius/laravel-publishable, this package is an add-on to a dependency you must also adopt — evaluate the pair, not the package alone.
Integration feasibility. Low effort on the happy path. composer require, then drop five components into a resource's form(), table(), filters(), and bulkActions(). No migrations, no config, no service provider registration surfaced in the README. The real integration work is elsewhere: confirming the parent trait is installed on target models, verifying column names match, and adding authorization around the publish action (Filament policies gate the resource, not publishing specifically). Expect roughly a sprint-day for a first resource end-to-end, wrapping as you go.
Technical risk.
PublishedFirstAt::make('expired_at') binds the wrong column, and the lang-publish command references a Nova-era provider class. The src/ directory is the source of truth; budget a verification spike.Key questions.
novius/laravel-publishable already adopted, or is this a joint adoption decision?Stack fit. Requires Laravel ≥ 11, PHP ≥ 8.2, Filament ≥ 4. Fits cleanly into a modern Filament admin panel with no infra changes, no new services, no data-model changes beyond what the parent trait already implies. It is a pure Composer dependency in the application layer.
Migration path. There is no migration in the data sense — the parent package owns schema. The integration path is:
PublicationColumn and PublicationStatusFilter.PublicationBulkAction.--tag=lang; the README's provider class is wrong).Pre-existing publication state (if any) lives in the parent's schema; this package doesn't move data.
Compatibility. Pin the package in composer.json. Treat Filament major upgrades as coordinated work items that include a compatibility check on this package, not incidental composer update events. The parent and this adapter should move in lockstep; check parent release notes before bumping either.
Sequencing.
App\Filament\Components\Publish\* classes (~30 lines) so replacement is a one-directory swap.Wrapping is non-negotiable for a package this thin and this low-adoption. Skip the wrapper and future replacement becomes a search-and-replace across every resource.
Maintenance. Low code footprint but non-zero maintenance load. Expect: occasional version bumps coordinated with Filament upgrades, ongoing reliance on a single maintainer for fixes, and the parent package's release cadence as the real dependency. The thin wrapper is the primary insurance policy — it converts "abandoned package" from an emergency into a contained swap.
Support. No commercial support, no SLA, no active community. Internal Slack-channel support is on the team that adopts it. Documentation drift (the README bugs) means onboarding relies on the vendor source, not the docs — that's a real ramp-up cost, not a formality.
Scaling. The UI surface scales trivially — forms and columns are cheap. The scaling risk is the bulk action. Verify before rollout: does it issue per-record save() calls or a single update? Does it dispatch model events? Does it wrap in a transaction? Partial failures without per-row feedback are the classic failure mode. Run against a few hundred rows with query logs on. Also confirm that any publish side effects implemented in observers fire consistently between single-record publish (from the edit page) and bulk publish (from the table); divergent behavior there is common and confusing.
Failure modes.
Ramp-up. Hours for a developer already fluent in Filament and Eloquent; effectively zero new concepts beyond the parent package's state machine. The ramp-up cost is not learning the API — it's learning to distrust the README, verifying component behavior against src/, and establishing conventions (authorization, side effects, wrapper) before the first rollout. Budget a short spike for the first resource to confirm the five components behave as expected in the actual panel; every subsequent resource is a copy-and-adjust exercise.
How can I help you explore Laravel packages today?