quarks/laravel-locking

轻松实现乐观 Eloquent 模型锁定功能到您的 Laravel 应用中。

1.0.1 2022-07-17 17:04 UTC

This package is auto-updated.

Last update: 2024-09-17 22:11:38 UTC


README

轻松实现乐观 Eloquent 模型锁定功能到您的 Laravel 应用。

Latest Version Downloads PHP Version License

安装

composer require quarks/laravel-locking

使用

在您的迁移类中,将版本列添加到您的表中,如下所示

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('blog_posts', function (Blueprint $table) {
        // create column for version tracking
        $table->lockVersion();
        // or to use a custom column name e.g., lock_version
        $table->lockVersion('lock_version');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('blog_posts', function (Blueprint $table) {
        $table->dropLockVersion(); // or $table->dropLockVersion('lock_version');
    });
}

然后按照如下方式将 LocksVersion 特性添加到您的模型类中

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Quarks\Laravel\Locking\LocksVersion;

class BlogPost extends Model
{
    use LocksVersion;
    
    /**
     * Override the default lock version column name, optional.
     */
    protected static function lockVersionColumnName()
    {
        return 'lock_version';
    }
}

在您的 blade 模板中,使用 lockInput 指令将当前锁定版本作为表单的一部分,如下所示

<form method="post">
    @lockInput($blogPost)
    
    <!-- more fields -->
</form>

在您的控制器中,使用以下辅助程序从请求中填充锁定版本

namespace App\Http\Controllers;

use Quarks\Laravel\Locking\LockedVersionMismatchException;

// ... other imports

class BlogPostController extends Controller
{

    // ... more methods

    public function update(BlogPost $blogPost, BlogPostRequest $request)
    {
        $data = $request->validated();
        $blogPost->fill($data);
        $blogPost->fillLockVersion();

        try {
            $blogPost->save();
        } catch (LockedVersionMismatchException $e) {
            abort(409, 'This model was already modified elsewhere.');
        }
    }
}

您的模型更新现在可以像上面那样简单地保护免受并发更新的影响。

许可证

LICENSE 文件。