Appearance
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.phpCommon Patterns
Field Class Structure
- Fields should be final by default:
php
final class Money extends Number
{
}- 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 CodeCustom 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
Consistent Naming
- Use clear, descriptive names for field classes
- Follow Laravel Nova's field naming conventions
Reusability
- Create custom fields for commonly used field configurations
- Keep field logic DRY across resources
Validation
- Include common validation rules in the field definition
- Document any special validation requirements
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]);
}