novius/laravel-filament-news
Filament v4 plugin to manage news posts in Laravel 11+: create posts with categories and tags, attach multiple of each, and browse categories as listing pages. Includes migrations and optional config to customize routes, locales, and resource/model overrides.
composer require novius/laravel-filament-news
php artisan migrate
NewsPlugin::make() to your AdminFilamentPanelProvider:
public function panel(Panel $panel): Panel {
return $panel->plugins([
NewsPlugin::make(),
]);
}
/admin/news/posts to manage posts, categories, and tags via Filament’s UI.publish-front command to generate routes:
php artisan news-manager:publish-front
/posts or /categories/{slug} to see the post.// Customize fields in PostResource.php
public static function form(Form $form): Form {
return $form
->schema([
TextInput::make('title')->required(),
RichEditor::make('content')->required(),
Select::make('status')->options(['draft', 'published']),
// ...
]);
}
// Override CategoryResource to add parent-child relationships
public static function table(Table $table): Table {
return $table->columns([
TextColumn::make('name'),
TextColumn::make('slug'),
// ...
]);
}
config/laravel-filament-news.php:
'front_routes_name' => [
'posts' => 'blog.index',
'post' => 'blog.show',
],
App\Http\Controllers\NewsController to add logic (e.g., pagination, filters):
public function index() {
return view('blog.index', [
'posts' => \Novius\LaravelFilamentNews\Models\NewsPost::published()->latest()->get(),
]);
}
spatie/laravel-translatable (required for i18n):
composer require spatie/laravel-translatable
php artisan vendor:publish --provider="Novius\LaravelFilamentNews\LaravelFilamentNewsServiceProvider" --tag="lang"
config/laravel-filament-news.php:
'locales' => ['en', 'fr'],
featured_image):
// In PostResource.php
public static function form(Form $form): Form {
return $form->schema([
// ...
FileUpload::make('featured_image')->image()->maxSize(2048),
]);
}
public static function getValidationRules(): array {
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'featured_image' => 'nullable|image|mimes:jpeg,png',
];
}
// routes/api.php
Route::apiResource('posts', \Novius\LaravelFilamentNews\Http\Controllers\Api\PostController::class);
AGPL License:
Filament Version Lock:
No Built-in API:
Limited Frontend Templates:
publish-front command as a starting point, then customize.Localization Gaps:
spatie/laravel-translatable for multi-language support.Route Conflicts:
config/laravel-filament-news.php:
'front_routes_name' => [
'posts' => 'custom.blog.index',
],
Migration Issues:
php artisan vendor:publish --provider="Novius\LaravelFilamentNews\LaravelFilamentNewsServiceProvider" --tag="migrations"
config/models.php if conflicts arise.Filament Plugin Not Loading:
NewsPlugin::make() is added to the panel() method in AdminFilamentPanelProvider.php artisan filament:cache-reset
Rich Text Editor Not Working:
trix or ckeditor is installed (Filament’s default rich editor dependency).npm install @filament/trix @filament/ckeditor
Performance with Large Datasets:
PostResource:
public static function getTableQuery(): Builder {
return parent::getTableQuery()->with(['categories', 'tags']);
}
Custom Resources/Models:
config/laravel-filament-news.php:
'resources' => [
'post' => App\Filament\Resources\CustomPostResource::class,
],
'models' => [
'post' => App\Models\CustomPost::class,
],
Adding Custom Fields:
PostResource to include additional fields (e.g., SEO metadata):
public static function form(Form $form): Form {
return $form->schema([
// ...
TextInput::make('meta_title')->required(),
Textarea::make('meta_description'),
]);
}
Customizing Frontend Views:
php artisan news-manager:publish-front
resources/views/vendor/news-manager/ to match your design system.Integrating with Media Libraries:
FileUpload or MediaLibrary packages to attach images/videos:
FileUpload::make('thumbnail')->image()->maxSize(2048),
Adding Widgets:
public static function getWidgets(): array {
return [
PostStatsWidget::class,
];
}
// In PostResource.php
protected static function getPages(): array {
return [
'create' => Pages\CreatePost::route('/'),
'edit' => Pages\EditPost::route('/{record}/edit'),
];
}
public static function getTableActions(): array {
return [
Tables\Actions\DeleteAction::make(),
Tables\Actions\ForceDeleteAction::make(),
];
}
How can I help you explore Laravel packages today?