devloops/nova-system-settings

一个Laravel Nova工具,它允许您在一个漂亮的UI和代码实现中定义系统设置。

v1.0.1 2024-05-25 23:08 UTC

This package is auto-updated.

Last update: 2024-09-22 10:09:10 UTC


README

Laravel Nova System Settings Tool

Latest Version on Packagist License Total Downloads

缺失的Laravel Nova系统设置工具。

此包为您节省了创建项目系统设置部分的时间,它以非常直观、方便的方式处理UI。它具有简单直接的Nova-like实现,并且是在Spatie的laravel-settings包的基础上构建的。

  • 查看Spatie的包文档以跟踪事物进展。

安装

composer require devloops/nova-system-settings

实现

使用此包非常简单,只需创建一个扩展Spatie的laravel-settings包中的Spatie\LaravelSettings\Settings类的抽象类Devloops\NovaSystemSettings\Contracts\SystemSettings的类,然后在NovaServiceProvider中注册工具,并给它一个包含您为系统定义的设置的数组。

以下是一个完整的示例

1- 创建您的设置类如下。

<?php

namespace App\Nova\Settings\General;

use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Devloops\NovaSystemSettings\Contracts\SystemSettings;


class SiteSettings extends SystemSettings
{

    public ?string $title;

    public ?string $slogan;

    public ?string $email;

    public ?string $phoneNumber;

    public ?string $address;

    public static function group(): string
    {
        return 'general';
    }

    public static function title(): string
    {
        return __('Site Settings');
    }

    public static function icon(): string
    {
        return 'cog';
    }

    public static function name(): string
    {
        return 'site_settings';
    }

    public static function fields(): array
    {
        return [
            Text::make(__('Site Title'), 'title'),
            Text::make(__('Site Slogan'), 'slogan'),
            Text::make(__('Site Email'), 'email'),
            Text::make(__('Site Phone Number'), 'phoneNumber'),
            Textarea::make(__('Site Address'), 'address'),
        ];
    }
}
<?php

namespace App\Nova\Settings\General;

use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Password;
use Devloops\NovaSystemSettings\Contracts\SystemSettings;

class MailSettings extends SystemSettings
{

    public ?string $mailer;

    public ?string $host;

    public ?int $port;

    public ?string $username;

    public ?string $password;

    public ?string $encryption;

    public static function group(): string
    {
        return 'general';
    }

    public static function title(): string
    {
        return __('Mail Settings');
    }

    public static function icon(): string
    {
        return 'mail';
    }

    public static function name(): string
    {
        return 'mail_settings';
    }

    public static function fields(): array
    {
        return [
            Select::make(__('Mailer'), 'mail')
                  ->options([
                      'smtp'     => __('SMTP'),
                      'sendmail' => __('Sendmail'),
                      'mailgun'  => __('Mailgun'),
                  ]),
            Text::make(__('Host'), 'host'),
            Number::make(__('Port'), 'port'),
            Text::make(__('Username'), 'username'),
            Password::make(__('Password'), 'password'),
            Select::make(__('Encryption'), 'encryption')
                  ->options([
                      null  => __('None'),
                      'tls' => __('TLS'),
                      'ssl' => __('SSL'),
                  ]),
        ];
    }
}
<?php

namespace App\Nova\Settings\Store;

use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Boolean;
use Devloops\NovaSystemSettings\Contracts\SystemSettings;

class OrderSettings extends SystemSettings
{
    public ?float $minOrder;

    public ?bool $allowGuestCheckout;

    public ?bool $allowFreeShipping;

    public static function group(): string
    {
        return 'store';
    }

    public static function title(): string
    {
        return __('Order Settings');
    }

    public static function icon(): string
    {
        return 'shopping-cart';
    }

    public static function name(): string
    {
        return 'order_settings';
    }

    public static function fields(): array
    {
        return [
            Number::make(__('Minimum Order'), 'minOrder'),
            Boolean::make(__('Allow Guest Checkout'), 'allowGuestCheckout'),
            Boolean::make(__('Allow Free Shipping'), 'allowFreeShipping'),
        ];
    }
}
<?php

namespace App\Nova\Settings\Tenant\Store;

use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Boolean;
use Devloops\NovaSystemSettings\Contracts\SystemSettings;

class CustomerSettings extends SystemSettings
{

    public ?string $loginVia;

    public ?bool $requiresEmailVerification;

    public ?int $canRegister;

    public static function group(): string
    {
        return 'store';
    }

    public static function title(): string
    {
        return __('Customer Settings');
    }

    public static function icon(): string
    {
        return 'user';
    }

    public static function name(): string
    {
        return 'customer_settings';
    }

    public static function fields(): array
    {
        return [
            Select::make(__('Login Via'))
                  ->options([
                      'email'        => __('Email'),
                      'phone_number' => __('Phone Number'),
                  ]),
            Boolean::make(__('Requires Email Verification'), 'requiresEmailVerification'),
            Boolean::make(__('Can Register'), 'canRegister'),
        ];
    }
}

上述类实现了从SystemSettings类继承的五个抽象方法,这些方法是

    /**
     * Get system settings group.
     *
     * @return string
     */
    abstract public static function group(): string;

    /**
     * Get system settings title.
     *
     * @return string
     */
    abstract public static function title(): string;

    /**
     * Get system settings icon.
     *
     * @return string
     */
    abstract public static function icon(): string;

    /**
     * Get system settings name.
     *
     * @return string
     */
    abstract public static function name(): string;

    /**
     * Return system settings fields.
     *
     * @return array
     */
    abstract public static function fields(): array;

方法上的注释说明了每个方法的目标。

2- 在App\Providers\NovaServiceProvider中通过tool()方法注册所有设置,如下例所示。

use App\Nova\Settings\General\SiteSettings;
use App\Nova\Settings\General\MailSettings;
use App\Nova\Settings\Store\OrderSettings;
use App\Nova\Settings\Store\CustomerSettings;

    public function tools(): array
    {
        return [
            NovaSystemSettings::make([
                //General
                SiteSettings::make(),
                MailSettings::make(),

                //Store
                OrderSettings::make(),
                CustomerSettings::make()
            ]),
        ];
    }

4- 系统设置组的标题是可翻译的,您需要创建一个区域文件resources/lang/en/system-settings.php

<?php

return [
    'groups' => [        
        'general'          => 'General',
        'store'            => 'Store',
    ],
];

5- 系统设置内部使用非常简单,就像Spatie的laravel-settings包一样,您可以通过依赖注入在您的服务、控制器、仓库或系统中的任何其他地方注入设置类。

<?php

namespace App\Http\Controllers\Api\V1;

use App\Nova\Settings\Store\CustomerSettings;
use App\Http\Requests\Api\V1\Auth\SendOtpRequest;

class AuthController extends ApiController
{

    public function __construct(
        public CustomerSettings $customerSettings
    ) {
    }

    public function sendOtp(SendOtpRequest $request)
    {
        dd($this->customerSettings->loginVia);
    }
}

截图

Screenshot 1

Screenshot 2

Screenshot 3

Screenshot $

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件