Laravel Nova provides a beautifully designed administration panel for Laravel applications. Its elegant interface and powerful features make building admin dashboards effortless. At ZIRA Software, Nova accelerates our admin panel development significantly.
Installation
composer require laravel/nova
php artisan nova:install
php artisan migrate
Creating Resources
// Generate resource
php artisan nova:resource Post
// app/Nova/Post.php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Http\Requests\NovaRequest;
class Post extends Resource
{
public static $model = \App\Models\Post::class;
public static $title = 'title';
public static $search = ['id', 'title', 'content'];
public function fields(NovaRequest $request)
{
return [
ID::make()->sortable(),
Text::make('Title')
->sortable()
->rules('required', 'max:255'),
Textarea::make('Content')
->rules('required')
->hideFromIndex(),
Boolean::make('Published')
->sortable(),
BelongsTo::make('Author', 'author', User::class)
->sortable(),
HasMany::make('Comments'),
DateTime::make('Created At')
->sortable()
->readonly(),
];
}
}
Custom Fields
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Image;
use Laravel\Nova\Fields\KeyValue;
use Laravel\Nova\Fields\Trix;
public function fields(NovaRequest $request)
{
return [
Select::make('Status')->options([
'draft' => 'Draft',
'published' => 'Published',
'archived' => 'Archived',
])->displayUsingLabels(),
Image::make('Featured Image', 'image')
->disk('public')
->path('posts')
->prunable(),
KeyValue::make('Metadata')
->rules('json'),
Trix::make('Body')
->withFiles('public'),
];
}
Actions
// Generate action
php artisan nova:action PublishPost
// app/Nova/Actions/PublishPost.php
class PublishPost extends Action
{
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $model) {
$model->update([
'published' => true,
'published_at' => now(),
]);
}
return Action::message('Posts published successfully!');
}
public function fields(NovaRequest $request)
{
return [
DateTime::make('Publish Date', 'published_at')
->default(now()),
];
}
}
// Register in resource
public function actions(NovaRequest $request)
{
return [
new PublishPost,
(new UnpublishPost)->showOnTableRow(),
];
}
Filters
// Generate filter
php artisan nova:filter PostStatus
// app/Nova/Filters/PostStatus.php
class PostStatus extends Filter
{
public function apply(NovaRequest $request, $query, $value)
{
return $query->where('status', $value);
}
public function options(NovaRequest $request)
{
return [
'Draft' => 'draft',
'Published' => 'published',
'Archived' => 'archived',
];
}
}
// Date range filter
class CreatedBetween extends Filter
{
public $component = 'date-filter';
public function apply(NovaRequest $request, $query, $value)
{
return $query->whereBetween('created_at', [
Carbon::parse($value['start']),
Carbon::parse($value['end']),
]);
}
}
Lenses
// Generate lens
php artisan nova:lens MostViewed
// app/Nova/Lenses/MostViewed.php
class MostViewed extends Lens
{
public static function query(LensRequest $request, $query)
{
return $request->withOrdering($request->withFilters(
$query->select(['id', 'title', 'views', 'created_at'])
->orderBy('views', 'desc')
->limit(10)
));
}
public function fields(NovaRequest $request)
{
return [
ID::make(),
Text::make('Title'),
Number::make('Views')->sortable(),
];
}
}
Metrics (Cards)
// Value metric
php artisan nova:value NewUsers
class NewUsers extends Value
{
public function calculate(NovaRequest $request)
{
return $this->count($request, User::class);
}
public function ranges()
{
return [
7 => '7 Days',
30 => '30 Days',
365 => '365 Days',
];
}
}
// Trend metric
class PostsPerDay extends Trend
{
public function calculate(NovaRequest $request)
{
return $this->countByDays($request, Post::class);
}
}
// Partition metric
class PostsByStatus extends Partition
{
public function calculate(NovaRequest $request)
{
return $this->count($request, Post::class, 'status');
}
}
Authorization
// Resource authorization
public static function authorizedToViewAny(Request $request)
{
return $request->user()->isAdmin();
}
public function authorizedToUpdate(Request $request)
{
return $request->user()->can('update', $this->resource);
}
// Field authorization
Text::make('Secret')
->canSee(fn ($request) => $request->user()->isAdmin()),
Conclusion
Laravel Nova transforms admin panel development from weeks to hours. Its elegant design and powerful features make it the premium choice for Laravel administration interfaces.
Need an admin panel? Contact ZIRA Software for Nova development.