sofa/model-locking

伪悲观模型锁定,带有广播事件,用于Laravel Eloquent ORM。

v7.0 2020-04-14 11:03 UTC

This package is auto-updated.

Last update: 2024-09-12 08:58:15 UTC


README

Build Status Coverage Status Downloads stable

伪悲观模型锁定,适用于Eloquent ORM (Laravel 5.3+)

安装

包与Laravel (Illuminate)版本兼容,方便使用

Laravel / Illuminate 5.3+

  1. 需要安装包:composer require sofa/model-locking:"~5.3"
  2. 如果你使用Laravel 5.1 - 5.4,请在config/app.php中的providers下添加:Sofa\ModelLocking\ServiceProvider::class,,
    如果你使用Laravel 5.5+,服务提供者将自动注册
  3. 发布包资源:php artisan vendor:publish --provider="Sofa\ModelLocking\ServiceProvider"
  4. 运行php artisan migrate创建模型锁定表
  5. 为需要提供锁定的模型添加特质use \Sofa\ModelLocking\Locking
  6. 可选:在config/model_locking.php中自定义包配置

使用

基本示例

// controller
public function edit(Post $post)
{
    if ($post->isLocked()) {
        return response([
            'status' => 'locked',
            'message' => 'Resource you are trying to access is locked',
            'lock_expiration' => $post->lockedUntil(),
        ], 423);
    }

    return view('posts.edit', compact('post'));
}

public function update(Post $post)
{
    if ($post->isAccessible(request('lock_token'))) {
        return redirect()->back()
                         ->withErrors(['danger' => 'Resource you are trying to update is locked']);
    }

    $post->update(request()->all());
    // broadcasts ModelUnlocked event, so you can push notification
    // to the user who tried to access locked post.
    $post->unlock();

    return redirect('posts.index');
}

public function requestUnlock(Post $post)
{
    if ($post->isAccessible()) {
        $token = $post->lock('5 minutes', auth()->user());

        return response([
            'status' => 'unlocked',
            'message' => 'Resource is now locked by you',
            'lock_expiration' => $post->lockedUntil(),
            'lock_token' => $token,
        ]);
    }

    // broadcasts ModelUnlockRequested event, so you can push
    // notification to the user who locked the resource.
    $post->requestUnlock(auth()->user(), request('unlock_message'));
}

// app/Console/Kernel - it will remove expired locks
//                      AND fire ModelUnlocked event for all of them
$schedule->command('locks:flush')->everyMinute();


// Available broadcasting events:
// new ModelLocked($post)
// new ModelUnlocked($post)
// new ModelUnlockRequested($post, $requesting_user, $request_message)

更多深入的信息即将到来,同时请查看规范

  /\ /\__ _| |__ | | __ _ _ __
 / //_/ _` | '_ \| |/ _` | '_ \
/ __ \ (_| | | | | | (_| | | | |
\/  \/\__,_|_| |_|_|\__,_|_| |_|

Sofa\ModelLocking\Locking
  ✔ it checks if active lock for model exists
  ✔ it checks if existing lock is still active
  ✔ it gets user who locked model
  ✔ it gets null as timestamp and user if model is not locked
  ✔ it sets by default authenticated user as one who is locking the model
  ✔ it unlocks the model on demand
  ✔ it lets you request unlock of a locked model
  ✔ it allows setting lock shortening when unlock request is made
  ✔ it verifies if model can be accessed with provided token
  ✔ it allows passing user_id as locking user
  ✔ it allows passing user instance as only param to `lock` method
  Lock duration precedence
    ✔ it locks the model for provided time by given user
    ✔ it next takes `lock_duration` property if set on the model
    ✔ it then falls back to the config
    ✔ it finally gets the default value: 5 minutes
  Fires broadcasting events to make push notifications a cinch
    ✔ it fires event when model is being locked
    ✔ it fires event when model is being unlocked
    ✔ it fires event when unlock request is made, with optional: requesting user and his message


Executed 23 of 23 PASS in 0.337 seconds

贡献

欢迎所有贡献,PR必须经过测试(使用kahlan)并且符合PSR-2规范。