hyperlink / laravel-model-locking
为Laravel-Model提供类似Wordpress的锁定功能。
0.3.0
2023-02-17 15:46 UTC
Requires
- php: ^8.0
- spatie/temporary-directory: ^2.1
Requires (Dev)
- orchestra/testbench: 7.0
- pestphp/pest-plugin-laravel: ^1.3
- roave/security-advisories: dev-latest
- spatie/pest-plugin-test-time: ^1.1
This package is auto-updated.
Last update: 2024-09-14 15:32:23 UTC
README
安装
您可以通过composer安装此包
composer require hyperlink/laravel-model-locking
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Hylk\Locking\ModelLockingServiceProvider" --tag="model-locking-config"
您可以使用以下命令发布翻译文件
php artisan vendor:publish --provider="Hylk\Locking\ModelLockingServiceProvider" --tag="model-locking-translations"
您可以通过以下方式发布vue组件
php artisan vendor:publish --provider="Hylk\Locking\ModelLockingServiceProvider" --tag="model-locking-vue"
用法
设置模型
在模型内部,只需使用IsLockable
特质。
class Post extends Model { use \Hylk\ModelLocking\IsLockable; ... }
此外,您还需要扩展模型的数据表。
return new class extends Migration { public function up() { Schema::table('posts', function (Blueprint $table) { $table->lockfields(); }); } public function down() { Schema::table('posts', function (Blueprint $table) { $table->dropLockfields(); }); } }
简单的模型锁定
如果您只需要简单的锁定版本,只需在控制器中调用特质方法。应将HEARTBEAT_LOCK_DURATION
设置为15分钟(900秒)。
class PostController { public function show(Post $post) { $post->lock(); } public function update(Request $request, Post $post) { $post->update($request->all()); $post->unlock(); } }
为了确保不丢失任何锁定,您应该在调度器中使用locking:release
Artisan命令。此外,您应发布配置并设置锁定持续时间为大约15分钟。
通过心跳进行模型锁定(Vue)
更高级的方法是通过心跳处理锁定。这仅适用于Vue
和axios
。
- 发布vue组件
- 注册全局心跳管理器
import Vue from 'vue'; import HeartbeatManager from './vendor/hylk/laravel-model-locking/heartbeat-manager'; ... window.axios = require('axios'); ... Vue.use(HeartbeatManager);
- 注册监听组件
- 用于索引页面
<template> <div> <HeartbeatListener model-class="App\Models\Post" :model-id="model_id" @locked="setLockState" @unlocked="deleteLockState" /> ... </div> </template>
通过lock
事件显示当前锁定者,并在unlock
-事件上删除此信息以处理所需的行为。... <span v-if="isLocked(model_id)">Locked by {{ getLock(model_id).locked_by.name }}</span> ...
- 在编辑表单上注册锁定刷新器
<template> <div> <HeartbeatLockRefresher model-class="App\Models\Post" :model-id="model_id" @lost="reloadRoute()" /> ... </div> </template>
lost
事件显示如果模型被其他用户锁定,组件是否尝试渲染。
环境变量
配置
除了环境变量外,还有一个middleware
键用于确定心跳路由使用的中间件。默认设置为api
。