uteq / laravel-move
Laravel 管理面板,由 Livewire 和 Jetstream 支持
Requires
- php: ^8.0
- ext-exif: *
- ext-json: *
- intervention/image: ^2.7
- laravel/jetstream: ^2.6
- livewire/livewire: ^2.10
- maatwebsite/excel: ^3.1
- spatie/data-transfer-object: ^2.6|^3.7
- spatie/laravel-medialibrary: ^10.0
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.12
- friendsofphp/php-cs-fixer: ^3.6
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.5
- spatie/laravel-ray: ^1.29
- vimeo/psalm: ^4.20
- dev-master
- v0.4.x-dev
- v0.4.1.x-dev
- 0.4.1
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.0
- dev-digipz
- dev-dependabot/npm_and_yarn/minimist-1.2.8
- dev-dependabot/npm_and_yarn/json5-1.0.2
- dev-dependabot/npm_and_yarn/express-4.18.2
- dev-dependabot/npm_and_yarn/qs-and-express-6.11.0
- dev-dependabot/npm_and_yarn/decode-uri-component-0.2.2
- dev-dependabot/npm_and_yarn/minimatch-3.1.2
- dev-dependabot/npm_and_yarn/terser-4.8.1
- dev-dependabot/npm_and_yarn/async-2.6.4
This package is auto-updated.
Last update: 2024-09-10 12:12:37 UTC
README
Laravel Move | 由 Livewire 和 Jetstream 支持的管理面板
该包仍在开发中,并且没有完整的测试套件。
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\StoreResource
和 Uteq\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)。请参阅许可文件获取更多信息。