moox/core

Moox Core 包负责许多常用功能。所有 Moox 包都需要它。

维护者

详细信息

github.com/mooxphp/core

主页

源代码

资助包维护!
mooxphp

2.1.4 2024-09-20 11:22 UTC

This package is auto-updated.

Last update: 2024-09-20 11:41:07 UTC


README

Moox Core

Moox Core

Moox Core 包负责许多常用功能。它由包括 Moox Builder 在内的所有 Moox 包所需要。如果您想使用 Moox Builder 来生成自定义包,请查看您已经可以使用的功能;如果您想在您的应用程序或包中独立使用 Moox Core,您需要相应地使用特性。

安装

如果您想安装 Moox Core(通常不是必需的,因为这个包由所有其他 Moox 包所需要),您可以

composer require moox/core
php artisan mooxcore:install

要求

Moox Core 需要以下包

特性

动态标签页

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)。更多信息请参阅许可证文件