This Laravel Nova settings tool based on env, using nativ nova fields and resources
MIT License
This Laravel Nova settings tool based on env, using nativ nova fields and resources
php: >=8.0
laravel/nova: ^4.0
# Install the package
composer require stepanenko3/nova-settings
Publish the config file:
php artisan vendor:publish --provider="Stepanenko3\NovaSettings\ToolServiceProvider" --tag="config"
Publish the migration file:
php artisan vendor:publish --provider="Stepanenko3\NovaSettings\ToolServiceProvider" --tag="migrations"
And run php artisan migrate
Next up, you must register the tool with Nova. This is typically done in the tools
method of the NovaServiceProvider
.
// in app/Providers/NovaServiceProvder.php
// ...
public function tools()
{
return [
// ...
new \Stepanenko3\NovaSettings\NovaSettingsTool(),
];
}
Create your own configuration classes in app/Nova/Settings
// in app/Nova/Settings/Demo.php
<?php
namespace App\Nova\Settings;
use Laravel\Nova\Fields\Boolean;
use Stepanenko3\NovaSettings\Types\AbstractType;
class Demo extends AbstractType
{
public function fields(): array
{
return [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
];
}
}
If you want to use eminiarts/nova-tabs
composer require eminiarts/nova-tabs
// in app/Nova/Settings/Demo.php
<?php
namespace App\Nova\Settings;
use Eminiarts\Tabs\Tab;
use Eminiarts\Tabs\Tabs;
use Laravel\Nova\Fields\Boolean;
use Stepanenko3\NovaSettings\Types\AbstractType;
class Demo extends AbstractType
{
public function fields(): array
{
return [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
new Tabs('Tabs 1', [
new Tab('Tab 1', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
new Tab('Tab 2', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
new Tab('Tab 3', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
]),
];
}
}
Delcare your settings class in config/nova-settings.php
<?php
return [
'model' => \Stepanenko3\NovaSettings\Models\Settings::class,
'resource' => \Stepanenko3\NovaSettings\Resources\Settings::class,
'types' => [
\App\Nova\Settings\Demo::class, // Add this line
],
];
Click on the "Settings"
menu item in your Nova app to see the tool.
Use helper function for access the settings
// settings(string|null $section, string|null $key = null, string|null $default = null, string|null $env = null)
settings('demo', 'key', 'defaultValue', config('app.env'))
Get cart_link
value from General
settings in current Env
settings('general', 'cart_link')
Get all General
settings
settings('general')
Get cart_link
value from General
settings in specific Env with default value
settings(
section: 'general',
key: 'cart_link',
default: true,
env: 'production'
);
// OR
settings('general', 'cart_link', true, 'production');
All the configuration is managed from a single configuration file located in config/nova-settings.php
Create your own model that will extends \Stepanenko3\NovaSettings\Models\Settings
// in app/Models/Settings.php
<?php
namespace App\Models;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;
class Settings extends \Stepanenko3\NovaSettings\Models\Settings
{
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logFillable()
->logOnlyDirty();
}
}
Declare your model 'model' => \App\Models\Settings::class,
in config/nova-settings.php
Create your own resource that will extends \Stepanenko3\NovaSettings\Resources\Settings
// in app/Nova/Settings.php
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\HasMany;
class Settings extends \Stepanenko3\NovaSettings\Resources\Settings
{
public function fields(Request $request)
{
return array_merge(parent::fields($request), [
HasMany::make('Activities', 'activities', 'App\Nova\ActivityLog'),
]);
}
}
Declare your resource 'resource' => \App\Nova\Settings::class,
in config/nova-settings.php
Don't forget to create App\Nova\ActivityLog
Use the settings->
prefix in the attribute
parameter of the dependsOn
method.
It is also necessary to get data from FormData
with settings->
prefix
Select::make('Purchase Type', 'type')
->options([
'personal' => 'Personal',
'gift' => 'Gift',
]),
Text::make('Recipient')
->readonly()
->dependsOn(
['settings->type'],
function (Text $field, NovaRequest $request, FormData $formData) {
if ($formData->{'settings->type'} === 'gift') {
$field->readonly(false)->rules(['required', 'email']);
}
}
),
Thank you for considering contributing to this package! Please create a pull request with your contributions with detailed explanation of the changes you are proposing.
This package is open-sourced software licensed under the MIT license.