uteq/laravel-move

Laravel 管理面板,由 Livewire 和 Jetstream 支持


README

Laravel Move | 由 Livewire 和 Jetstream 支持的管理面板

Latest Version on Packagist GitHub Tests Action Status Total Downloads

该包仍在开发中,并且没有完整的测试套件。

Move 使得使用 Laravel 和 Livewire 创建自己的管理面板变得非常简单。本包深受 Laravel Nova 的启发。几乎工作方式相同,除了缺少一些功能。

以下是如何使用它的示例

<?php

namespace App\Move;

use Uteq\Move\Fields\Id;
use Uteq\Move\Fields\Text;
use Uteq\Move\Resource;

class User extends Resource
{
    public static $model = \App\Models\User::class;

    public static string $title = 'name';

    public function fields()
    {
        return [
            Id::make(),

            Text::make('Name', 'name'),
        ];
    }
}

这是一个带有用户的简单示例:

待办事项

  • 包依赖项
  • 测试

支持我们

最好的支持是通过改进这个包。还有很多工作要做。例如

  • 文档 -- 设置 -- 字段(也:面板和步骤) -- 搜索 -- 操作 -- 权限 -- 定制化 -- 可重用(Move 以多种方式可重用)
  • 测试覆盖率
  • 字段扩展(添加各种字段)
  • 存根和类生成器
  • 卡片(如 Laravel Nova 卡片)

安装

您可以通过 composer 安装此包

composer require uteq/laravel-move

Laravel Move 将将 Jetstream 添加到您的 vendor 文件夹,但不会自动安装它。因此,为了方便起见,我们专门制作了一个命令,该命令将安装 Jetstream 并启动 Move 管理面板。因为 Move 使用 Livewire 作为首选栈,所以您不需要提供栈。此外,您还可以使用 --teams 切换来启用团队支持

php artisan move:install --team

要完成安装,请运行

php artisan migrate

可选

配置 Jetstream

有关更多 Jetstream 相关设置,请参阅:https://jetstream.laravel.net.cn/2.x/installation.html#installing-jetstream

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Uteq\Move\MoveServiceProvider" --tag="move-config"

您可以使用以下命令发布视图文件

php artisan vendor:publish --provider="Uteq\Move\MoveServiceProvider" --tag="move-views"

用法

创建您的第一个资源

首先创建您的第一个 Move 资源。您可以生成它或使用下面的示例

生成您的资源

php artisan move:resource User --model=User

使用示例资源

<?php

namespace App\Move;

use Uteq\Move\Fields\Id;
use Uteq\Move\Fields\Text;
use Uteq\Move\Resource;

class User extends Resource
{
    public static $model = \App\Models\User::class;

    public static string $title = 'name';

    public function fields()
    {
        return [
            Id::make(),

            Text::make('Naam', 'name')
                ->rules(['required', 'string', 'max:255'])
                ->required(),

            Text::make('E-mailadres', 'email')
                ->hideWhenUpdating()
                ->requiredOnCreateOnly()
                ->creationRules(['required', 'string', 'email', 'max:255', 'unique:users']),

            Status::make('E-mail bevestigd?', 'email_verified_at', fn ($value) => $value !== null)
                ->hideFromForm(),

            Panel::make('Wachtwoord wijzigen', [
                Password::make('Wachtwoord', 'password', null)
                    ->creationRules($this->passwordRules())
                    ->requiredOnCreateOnly(),

                Password::make('Wachtwoord bevestigen', 'password_confirmation')
                    ->hideFromIndex()
                    ->hideFromDetail()
                    ->onlyForValidation(fn ($value, $field, $model) => $model->id)
                    ->requiredOnCreateOnly(),
            ])
            ->nameOnCreate('Wachtwoord')
            ->nameOnUpdate('Wachtwoord wijzigen'),

            Panel::make('Rol kiezen', [
                Role::make('Rol', 'role'),
            ]),
        ];
    }

    public function filters()
    {
        return [];
    }

    public function actions()
    {
        return [];
    }
}

路由前缀

Move 默认为您的资源添加前缀,这样它就不会与您自己的路由冲突。默认前缀为 move。您可以通过在本地 MoveServiceProvider 中覆盖它来更改默认前缀 App\Providers\MoveServiceProvider

use Illuminate\Support\Facades\Route;

function register()
{
    Route::move('my-prefix');
}

手动注册资源命名空间

Move 的默认命名空间为 App\Move。您还可以在您喜欢的任何位置注册 Move 资源。您可以通过以下方式引导此命名空间

use Uteq\Move\Facades\Move;

public function register()
{
    Move::resourceNamespace('App\\Resources', 'resources');
}

这将自动为路由创建命名空间。该命名空间的默认路由将是

https://move.test/move/resources/your-resource

该资源的默认名称将是

resources.your-resource

使用 json 字段存储数据

如果您与无法在 mysql 数据库结构中明确定义的数据结构大量工作,您可能会选择类似于 json 字段的东西。

首先将您的 json 字段添加到您的表中。

$table->json('meta')->nullable();

然后确保在您模型中正确地进行类型转换

protected $casts ['meta' => 'json'];

最后,在您的资源中添加一个字段

Text::make('My meta value', 'meta.my_value'),

资源

支持的字段类型

以下是 Move 当前支持的字段

  • 国家
  • 日期
  • 文件
  • 标识
  • 数字
  • 密码
  • 选择(带筛选搜索)
  • 状态
  • 文本
  • 多行文本框
  • 编辑器

侧边栏

Move 会自动将资源注册到侧边栏。默认情况下,有两种方式显示您的侧边栏资源。分组和平铺。默认是分组,并由 \App\Providers\MoveServiceProvider 发布。

Move::useSidebarGroups(true);

要使用平铺显示,只需更改到

Move::useSidebarGroups(false);

当您使用侧边栏组时,也应该设置资源属性

class User extends \Uteq\Move\Resource
{
    public static string $group = 'admin';
}

排序侧边栏项目

目前,这不是一个支持的功能,请随意创建一个 PR。或者,您可以直接覆盖 components/sidebar-menu.blade.php 文件。

按命名空间排序侧边栏

每次您希望按给定的命名空间排序侧边栏时,请使用分组侧边栏方法。如果不这样做,您始终可以覆盖 components/sidebar-menu.blade.php 文件或创建一个 PR。

覆盖侧边栏菜单标志

<x-move-sidebar>
    <x-slot name="logo">
        <a class="text-center" href="/">
            <h1 class="text-2xl text-white font-black">{{ config('app.name') }}</h1>
        </a>
    </x-slot>
</x-move-sidebar>

覆盖侧边栏菜单项

您可以完全覆盖侧边栏项以及标志。

<x-move-sidebar :keep-not-custom="false" :with-padding="false">
    <!-- You can also add you own html + css here, move just has a link component -->
    <x-move-sidebar.link href="{{ route('dashboard') }}" alt-active="admin/dashboard/*">
        Dashboard
    </x-move-sidebar.link>
</x-move-sidebar>

您还可以保留自动生成的侧边栏项,并在自动创建之前添加自己的项。这是默认行为。

<x-move-sidebar>    
    <x-move-sidebar.link href="{{ route('dashboard') }}" alt-active="admin/dashboard/*">
        Dashboard
    </x-move-sidebar.link>
</x-move-sidebar>

深入了解

解析资源

解析资源意味着加载您的资源类的具体实现。您可以通过提供资源名称来完成此操作

use \Uteq\Move\Facades\Move;

Move::resolveResource('resources.your-resource');

覆盖默认 $actionHandlers

操作处理器是使您能够以您偏好的方式存储和删除资源的类。默认情况下,Move 将有自己的默认逻辑。Move 提供了两个默认操作处理器 Uteq\Move\DomainActions\StoreResourceUteq\Move\DomainActions\DeleteResource。您可以从资源中覆盖这些处理器,默认情况下。

创建自己的操作处理器

class StoreHandler
{
    public function __invoke(Model $model, array $input = [])
    {
        //... Basic validation
        
        $model->fill($input)->save();
        
        return $model;
    }
}

您也可以扩展默认的 StoreResource,但这不是强制的。

覆盖全局默认 $actionHandlers

从 ServiceProvider 中覆盖操作处理器。

use Uteq\Move\Resource;

public function register()
{
    Resource::$defaultActionHandlers = [
        'update' => StoreResource::class,
        'create' => StoreResource::class,
        'delete' => DeleteResource::class,
    ];
}

从您的资源中覆盖默认 $actionHandlers

简单地将 $actionHandlers 添加到您的资源中

use Uteq\Move\Resource;
use App\Actions\CustomResource;

class CustomResource extends Resource
{
    public array $actionHandlers = [
        'create' => CustomResource\Create::class,
        'update' => CustomResource\Update::class,
        'delete' => CustomResource\Delete::class,
    ];
}

这将覆盖特定于资源的操作处理器。

钩子

模型保存前

挂钩到保存前最推荐的方式是使用默认的 Laravel 事件 https://laravel.net.cn/docs/eloquent#events。您还可以通过添加提供可调用的 beforeSave 方法来挂钩到 Store 操作。

public function beforeSave()
{
    return [
        fn($resource, $model, $data) => $data['rand'] = rand(1, 99),
        function($resource, $model, $data) {
            return $data['rand'] = rand(1, 99);
        },
        new MyCustomBeforeSaveAction,
    ];
}

模型保存后

挂钩到保存后的最推荐的方式是使用默认的 Laravel 事件 https://laravel.net.cn/docs/eloquent#events。您也可以通过添加提供可调用的 afterSave 方法来挂钩到 Store 操作。

public function afterSave()
{
    return [
        fn($resource, $model, $data) => $data['rand'] = rand(1, 99),
        function($resource, $model, $data) {
            return $data['rand'] = rand(1, 99);
        },
        new MyCustomAfterSaveAction,
    ];
}

字段保存前

每次您需要更改字段存储(创建或更新)数据的方式时,您可以通过挂钩到 beforeStore 方法来完成。每个字段都有这个方法。

Text::make('Name', 'name')
    ->beforeStore(function($value) {
        // ... Mutate the fields value to any given format.
        return $value;
    });

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献指南

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略

致谢

许可证

MIT许可证(MIT)。请参阅许可文件获取更多信息。