hyperlink/laravel-model-locking

为Laravel-Model提供类似Wordpress的锁定功能。

0.3.0 2023-02-17 15:46 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)

更高级的方法是通过心跳处理锁定。这仅适用于Vueaxios

  1. 发布vue组件
  2. 注册全局心跳管理器
    import Vue from 'vue';
    import HeartbeatManager from './vendor/hylk/laravel-model-locking/heartbeat-manager';
    ...
    window.axios = require('axios');
    ...
    Vue.use(HeartbeatManager);
  3. 注册监听组件
    1. 用于索引页面
    <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>
    ...
  4. 在编辑表单上注册锁定刷新器
    <template>
       <div>
          <HeartbeatLockRefresher model-class="App\Models\Post"
              :model-id="model_id"
              @lost="reloadRoute()" />
          ...
       </div>
     </template>
    lost事件显示如果模型被其他用户锁定,组件是否尝试渲染。

环境变量

配置

除了环境变量外,还有一个middleware键用于确定心跳路由使用的中间件。默认设置为api