Skip to content

Nova Field Conventions

Custom Fields Organization

Custom fields are located in app/Nova/Common/Fields/ and extend Nova's base field types:

text
app/Nova/Common/Fields/
├── DateTime.php
├── DangerHeading.php
├── HelpHeading.php
├── JsonCode.php
├── KeyValue.php
└── Money.php

Common Patterns

Field Class Structure

  1. Fields should be final by default:
php
final class Money extends Number
{
}
  1. Fields should extend appropriate Nova base fields:
php
final class DateTime extends BaseDateTime
final class KeyValue extends \Laravel\Nova\Fields\KeyValue
final class JsonCode extends Code

Custom Field Types

DateTime Field

php
namespace App\Nova\Fields;

use Laravel\Nova\Fields\DateTime as BaseDateTime;

final class DateTime extends BaseDateTime
{
    public function __construct($name, $attribute = null)
    {
        parent::__construct($name, $attribute);

        $this->displayUsing(function ($value) {
            // Custom datetime formatting
        });
    }
}

Money Field

php
namespace App\Nova\Fields;

use Laravel\Nova\Fields\Number;

final class Money extends Number
{
    public function __construct($name, $attribute = null)
    {
        parent::__construct($name, $attribute);

        $this->displayUsing(function ($value) {
            // Custom money formatting
        })
        ->step(0.01);
    }
}

Heading Fields

php
namespace App\Nova\Fields;

use Laravel\Nova\Fields\Heading;

final class DangerHeading extends Heading
{
    public function __construct($value)
    {
        parent::__construct($value);

        $this->asHtml()
             ->withMeta(['class' => 'danger-heading']);
    }
}

final class HelpHeading extends Heading
{
    public function __construct($value)
    {
        parent::__construct($value);

        $this->asHtml()
             ->withMeta(['class' => 'help-heading']);
    }
}

JSON Code Field

php
namespace App\Nova\Fields;

use Laravel\Nova\Fields\Code;

final class JsonCode extends Code
{
    public function __construct($name, $attribute = null)
    {
        parent::__construct($name, $attribute);

        $this->json()
             ->language('json')
             ->autoHeight();
    }
}

Usage Examples

In Resources

php
use App\Nova\Fields\DateTime;use App\Nova\Fields\JsonCode;use App\Nova\Fields\Money;

public function fields(NovaRequest $request): array
{
    return [
        DateTime::make('Created At'),
        Money::make('Amount'),
        JsonCode::make('Metadata'),
    ];
}

With Custom Formatting

php
DateTime::make('Created At')
    ->sortable()
    ->filterable(),

Money::make('Amount')
    ->sortable()
    ->displayUsing(fn ($value) => format_money($value)),

JsonCode::make('Configuration')
    ->rules('json')
    ->hideFromIndex(),

Best Practices

  1. Consistent Naming

    • Use clear, descriptive names for field classes
    • Follow Laravel Nova's field naming conventions
  2. Reusability

    • Create custom fields for commonly used field configurations
    • Keep field logic DRY across resources
  3. Validation

    • Include common validation rules in the field definition
    • Document any special validation requirements
  4. Display Formatting

    • Use consistent display formatting across similar fields
    • Consider localization requirements

Field Configuration

Common Field Options

php
public function configureField(): void
{
    $this->sortable()
         ->filterable()
         ->nullable()
         ->hideFromIndex()
         ->help('Field help text');
}

Validation Rules

php
public function defaultRules(): array
{
    return [
        'required',
        'numeric',
        'min:0',
    ];
}

Custom Formatting

php
public function resolveForDisplay($value, $resource): mixed
{
    // Custom display formatting
    return $this->format($value);
}

Field Dependencies

php
public function dependsOn(array $dependencies): self
{
    return $this->withMeta(['dependsOn' => $dependencies]);
}