devloops / nova-system-settings
一个Laravel Nova工具,它允许您在一个漂亮的UI和代码实现中定义系统设置。
v1.0.1
2024-05-25 23:08 UTC
Requires
- php: ^8.2
- laravel/nova: ^4.0
- spatie/laravel-settings: ^3.3
README
缺失的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); } }
截图
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。