sofa / model-locking
伪悲观模型锁定,带有广播事件,用于Laravel Eloquent ORM。
资助包维护!
jarektkaczyk
softonsofa.com
v7.0
2020-04-14 11:03 UTC
Requires
- php: >=7.0.0
- illuminate/database: ^5.5|^6.0|^7.0
- illuminate/queue: ^5.5|^6.0|^7.0
Requires (Dev)
- kahlan/kahlan: ~2.5
README
伪悲观模型锁定,适用于Eloquent ORM (Laravel 5.3+)。
安装
包与Laravel (Illuminate)版本兼容,方便使用
Laravel / Illuminate 5.3+
- 需要安装包:
composer require sofa/model-locking:"~5.3"
- 如果你使用Laravel 5.1 - 5.4,请在
config/app.php
中的providers
下添加:Sofa\ModelLocking\ServiceProvider::class,
,
如果你使用Laravel 5.5+,服务提供者将自动注册 - 发布包资源:
php artisan vendor:publish --provider="Sofa\ModelLocking\ServiceProvider"
- 运行
php artisan migrate
创建模型锁定表 - 为需要提供锁定的模型添加特质
use \Sofa\ModelLocking\Locking
- 可选:在
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规范。