moox / core
Moox Core 包负责许多常用功能。所有 Moox 包都需要它。
Requires
- php: ^8.2.0
- codeat3/blade-google-material-design-icons: ^1.0
- filament/filament: ^3.2
- laravel/framework: ^10.0|^11.0
- pharaonic/laravel-readable: ^1.0.5
- ryangjchandler/filament-progress-column: ^1.0
- spatie/laravel-package-tools: ^1.13.0
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^9.0.0||^8.22.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-arch: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- spatie/laravel-ray: ^1.35
README
Moox Core
Moox Core 包负责许多常用功能。它由包括 Moox Builder 在内的所有 Moox 包所需要。如果您想使用 Moox Builder 来生成自定义包,请查看您已经可以使用的功能;如果您想在您的应用程序或包中独立使用 Moox Core,您需要相应地使用特性。
安装
如果您想安装 Moox Core(通常不是必需的,因为这个包由所有其他 Moox 包所需要),您可以
composer require moox/core php artisan mooxcore:install
要求
Moox Core 需要以下包
- https://filamentphp.com/ 和 https://laravel.net.cn/ 通常为最新稳定版本,请参阅 composer.json
- https://github.com/Pharaonic/laravel-readable - 用于格式化数字和日期为人类可读格式
- https://github.com/ryangjchandler/filament-progress-column - 在 Filament 表中使用进度条
- https://github.com/codeat3/blade-google-material-design-icons - 我们使用 Google Material Design 图标
特性
动态标签页
Moox 允许您更改(或删除)Filament 资源的筛选标签页。HasDynamicTabs 特性被用于我们所有的包中,包括 Moox Builder。
禁用标签页
如果您想禁用此资源的标签页,只需这样做
'tabs' => [],
一个相当基本的例子
'tabs' => [ 'all' => [ 'label' => 'trans//core::core.all', 'icon' => 'gmdi-filter-list', 'query' => [], ], 'user' => [ 'label' => 'trans//core::core.user_session', 'icon' => 'gmdi-account-circle', 'query' => [ [ 'field' => 'user_id', 'operator' => '!=', 'value' => null, ], ], ], ],
如前所述,DynamicTabs 特性已经实现,如果您想从外部实现此功能,请查看我们的 Filament 资源列表页面之一
use Moox\Core\Traits\HasDynamicTabs; class ListItems extends ListRecords { use HasDynamicTabs; public function getTabs(): array { return $this->getDynamicTabs('package.resources.item.tabs', Expiry::class); }
以及包的配置
'resources' => [ 'item' => [ /* |-------------------------------------------------------------------------- | Tabs |-------------------------------------------------------------------------- | | Define the tabs for the Resource table. They are optional, but | pretty awesome to filter the table by certain values. | You may simply do a 'tabs' => [], to disable them. | */ 'tabs' => [ 'all' => [ 'label' => 'trans//core::core.all', 'icon' => 'gmdi-filter-list', 'query' => [], ], 'documents' => [ 'label' => 'trans//core::core.documents', 'icon' => 'gmdi-text-snippet', 'query' => [ [ 'field' => 'expiry_job', 'operator' => '=', 'value' => 'Documents', ], ], ], ], ], ],
配置中的查询
动态标签页使用 QueriesInConfig 特性,这意味着您可以构建如下查询
最简单的查询当然是所有标签页
'query' => [],
所有其他查询需要三个参数
'query' => [ [ 'field' => 'status', 'operator' => '=', 'value' => 'open', ], ],
根据需要添加更多
'query' => [ [ 'field' => 'post_type', 'operator' => '=', 'value' => 'Post', ], [ 'field' => 'deleted', 'operator' => '!=', 'value' => 'false', ], ],
我们目前还不支持关系或类似操作符。如果您需要,我们非常乐意合并一个 PR :-)
// TODO: not implemented yet 'query' => [ [ 'field' => 'user_name', 'relation' => 'user', 'operator' => 'like', 'value' => 'Alf', ], ],
查询的值可以接受一个闭包。以下示例非常适合“我的标签页”,因为它会筛选当前用户
'query' => [ [ 'field' => 'user_id', 'operator' => '=', 'value' => function () { return auth()->user()->id; }, ], ],
最后,一个特殊想法,因此尚未实现:如果值包含一个类和第四个参数 hide-if-not-exists
设置为 true,Moox 将检查该类是否存在,如果不存在,则隐藏标签页。这允许我们为不一定是必需的包注册按钮。
// TODO: not implemented yet 'query' => [ [ 'field' => 'status', 'operator' => '=', 'value' => 'Moox\Press\Models\WpUser', 'hide-if-not-exists' => true, ], ],
一个实际例子(适用于会话、设备和其他与用户相关的实体)
'tabs' => [ 'mine' => [ 'label' => 'My Sessions', 'icon' => 'gmdi-account-circle', 'query' => [ [ 'field' => 'user_id', 'operator' => '=', 'value' => function () { return auth()->user()->id; }, ], ], ], 'all' => [ 'label' => 'trans//core::core.all', 'icon' => 'gmdi-filter-list', 'query' => [], ], 'user' => [ 'label' => 'User Sessions', 'icon' => 'gmdi-account-circle', 'query' => [ [ 'field' => 'user_type', 'operator' => '=', 'value' => 'Moox\User\Models\User', ], ], ], 'wpuser' => [ 'label' => 'WordPress Sessions', 'icon' => 'gmdi-account-circle', 'query' => [ [ 'field' => 'user_type', 'operator' => '=', 'value' => 'Moox\Press\Models\WpUser', ], ], ], 'anonymous' => [ 'label' => 'Anonymous Sessions', 'icon' => 'gmdi-no-accounts', 'query' => [ [ 'field' => 'user_id', 'operator' => '=', 'value' => null, ], ], ], ],
最后,最常见的错误,会抛出“Cannot access offset of type string on string”错误
'query' => [ 'field' => 'user_id', 'operator' => '=', 'value' => null, ],
所以,别忘了将查询放在一个额外的数组中,即使它是一个单一的查询。
如前所述,QueriesInConfig 特性在 HasDynamicTabs 中使用,这是 Moox Core 中的另一个特性。请查看那里的代码,以了解如何从外部实现此功能。
配置中的翻译
一个简单但有用的特性是 TranslationsInConfig 特性,它在我们的配置文件中使用很多,就像标签页一样
'label' => 'trans//core::core.all',
我们包的翻译通常组织在Moox核心中。只有少数包附带了自带的翻译文件。这些包已在core.php配置文件中注册。如果您开发自定义包(最好使用Moox Builder),则需要将自定义包添加到包注册。
配置中的翻译在CoreServiceProvider中使用如下
use Moox\Core\Traits\TranslatableConfig; class CoreServiceProvider extends PackageServiceProvider { use TranslatableConfig; public function boot() { parent::boot(); $this->app->booted(function () { $this->translateConfigurations(); }); } }
模型中的请求
RequestInModel特质目前被所有Moox Press包使用。它允许我们在一些模型中使用请求数据。您可以通过查看Moox\Press\Models\WpTerm.php来深入代码,找到更多代码示例。基本实现如下
use Illuminate\Database\Eloquent\Model; use Moox\Core\Traits\RequestInModel; class WpTerm extends Model { use RequestInModel; $description = $wpTerm->getRequestData('description'); }
Google Material Design图标
由于Google Material Design Icons提供了一组高质量图标,我们决定将其用作Moox的默认图标。GoogleIcons特质也更改了默认的Filament图标。它在CoreServiceProvider中如下使用
use Moox\Core\Traits\GoogleIcons; class CoreServiceProvider extends PackageServiceProvider { use GoogleIcons; public function boot() { parent::boot(); $this->useGoogleIcons(); } }
您可以通过配置禁用Google图标并使用Filament默认图标。
日志级别
日志级别是Moox中调试事物的有用功能,即使在生产环境中,或在开发时让日志保持沉默。
$this->logDebug('This is a debug message'); $this->logInfo('This is an info message');
您可以在Moox Core的配置中调整日志级别以及在生产中是否记录。
服务
DNS查找
DnsLookupService只执行DNS查找。该服务目前在使用Moox Sync的PlatformResource时如下使用
use Moox\Core\Services\DnsLookupService; class PlatformResource extends Resource { public static function form(Form $form): Form { return $form->schema([ Section::make()->schema([ Grid::make(['default' => 0])->schema([ TextInput::make('domain') ->label(__('core::core.domain')) ->rules(['max:255', 'string']) ->required() ->unique(ignoreRecord: true) ->live(debounce: 500) ->afterStateUpdated(function ($state, callable $set) { if (empty($state)) { $set('ip_address', 'The host is not resolvable'); } else { $ipAddress = DnsLookupService::getIpAddress($state); $set('ip_address', $ipAddress ?: 'The host is not resolvable'); } }) ]), ]), ]); }
API
核心API
核心API api/core
提供了所有可用的包(及其配置)。
目前未使用,可能会更改或删除。
模型API
模型API api/models
提供了所有可用和已加载的模型。例如,Moox Sync使用它。
模型API正在开发中。它可能需要安全保护。
共享主机API
共享主机API schedule/run
用于在共享主机环境中运行计划任务。
https://yourdomain.com/schedule/run?token=secure
如果您想使用共享主机API,需要将SHARED_HOSTING_ENABLED
配置设置为true
,并将SHARED_HOSTING_TOKEN
配置为安全令牌。
配置
包注册
Moox有一个简单的包注册。为了确保Moox Core的一些功能仅适用于已知包,所有Moox包以及所有使用Moox Builder创建的自定义包都需要在此注册
/* |-------------------------------------------------------------------------- | Moox Packages |-------------------------------------------------------------------------- | | This config array registers all known Moox packages. You may add own | packages to this array. If you use Moox Builder, these packages | work out of the box. Adding a non-compatible package fails. | */ 'packages' => [ 'audit' => 'Moox Audit', 'builder' => 'Moox Builder', 'core' => 'Moox Core', 'expiry' => 'Moox Expiry', 'jobs' => 'Moox Jobs', 'login-link' => 'Moox Login Link', 'notifications' => 'Moox Notifications', 'page' => 'Moox Page', 'passkey' => 'Moox Passkey', 'permission' => 'Moox Permission', 'press' => 'Moox Press', 'press-wiki' => 'Moox Press Wiki', 'security' => 'Moox Security', 'sync' => 'Moox Sync', 'training' => 'Moox Trainings', 'user' => 'Moox User', 'user-device' => 'Moox User Device', 'user-session' => 'Moox User Session', ], ];
您可以发布Moox Core配置文件并添加自己的包
php artisan vendor:publish --tag="core-config"
但请记住,要使较新的Moox包能够无缝工作,需要定期更新数组。
禁用Google图标
您可以禁用Google图标,并使用Filament默认图标集(Heroicons)代替。
这禁用了在Core中完成的Filament核心图标的替换,以及我们大部分包的单独图标。一些包将保留Google图标,因为Heroicon集中没有相应的图标。
/* |-------------------------------------------------------------------------- | Google Icons |-------------------------------------------------------------------------- | | We use Google Material Design Icons, but if you want to use the | Heroicons, used by Filament as default, you can disable the | Google Icons here. This will affect the whole application. | */ 'google_icons' => true,
日志记录
您可以调整日志级别以及是否在生产中记录。目前由Moox Sync使用,也很快将被其他Moox包使用。
/* |-------------------------------------------------------------------------- | Logging |-------------------------------------------------------------------------- | | This config array sets the logging level and whether to log in | production. It is used by some Moox packages where verbose | logging is a good thing while implementing complex stuff. | */ 'logging' => [ 'verbose_level' => env('VERBOSE_LEVEL', 0), // 0: Off, 1: Debug, 2: Info, 3: All 'log_in_production' => env('LOG_IN_PRODUCTION', false), ],
共享主机
您可以使用共享主机功能。如果您想在共享主机环境中运行计划任务,这很有用。它允许您从URL运行queue:work
和'schedule:run'命令。
/* |-------------------------------------------------------------------------- | Shared Hosting |-------------------------------------------------------------------------- | | This config array sets the shared hosting token. This token is used to | authenticate requests from shared hosting environments. | */ 'shared_hosting' => [ 'enabled' => env('SHARED_HOSTING_ENABLED', false), 'token' => env('SHARED_HOSTING_TOKEN', 'secret'), ],
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
安全漏洞
请查阅我们的安全策略,了解如何报告安全漏洞。
致谢
许可证
MIT许可证(MIT)。更多信息请参阅许可证文件。