您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
删除Task相关的逻辑及权限验证(laravel11中的事务与针对inertia的错误回抛back)
发布时间:2024-11-08 19:06:59编辑:雪饮阅读()
-
要说删除逻辑其实很简单,就是普通的get请求也可以,但是一般如果不是特别忙的情况下,还是来按标准的吧。
那么在用户task列表Index.vue中
在inertia+laravel架构下,首先我们肯定不是纯链接
<el-link :icon="Delete" @click="deleteFunc(task.id)">Delete</el-link>
这里需要导入Delete
import { Edit,Plus,Delete } from '@element-plus/icons-vue'
然后删除方法是基于表单的
const form = useForm({
id: 0,
});
const deleteFunc=(taskId)=>{
form.id=taskId;
form.delete(route('user_task.delete'), {
preserveScroll: true,
onSuccess: () => {
},
onError: (errors) => {
},
onFinish: () => {
}
});
}
那么接下来我们需要在web.php中增加删除的路由
Route::delete('/user_task/delete', [UserTask::class, 'delete'])->name('user_task.delete');
那么UserTask.php中实现删除逻辑,但我们不仅仅是task表,我们还要投递job的那个表,所以需要关联删除。当然用模型关联删除也可以,但模型关联删除是否有用事务,还不是很清楚,我这里暂时仅仅用事务进行手动事务处理。以及删除遇到错误的回抛于inertia,需要用back。则控制器中的delete实现如
public function delete(Request $request):RedirectResponse
{
$id=$request->input("id");
DB::beginTransaction();
try{
$userTask=\App\Models\UserTask::find($id);
$job=Jobs::find($userTask->job_id);
if($job){
$job->delete();
}
$userTask->delete();
DB::commit();
}
catch(\Exception $e){
DB::rollBack();
return back()->with([
'message' => $e->getMessage(),
]);
}
return Redirect::route('user_task.index');
}
那么既然删除需要回抛错误,那么对user task进行save的时候同样。所以上篇中的UserTaskRepository.php中的update再次实现如
public function update($request)
{
$id=$request->input("id");
if($id){
$userTask=\App\Models\UserTask::find($id);
if (! Gate::allows('update-user-task', $userTask)) {
abort(403);
}
}
if(!$id){
$userTask=new \App\Models\UserTask();
}
$uid=$request->user()->id;
$type=$request->input("type");
$param=$request->input("param");
$userTask->uid=$uid;
$userTask->type=$type;
$userTask->param=json_encode($param);
$delayTime=strtotime($param["sendTime"])-time();
$param["body"]=$param["body"].",".$param["sendTime"];
$oldJob=Jobs::orderBy("id","desc")->first();
ProcessSendEmail::dispatch($param)->delay($delayTime);
$newJob=Jobs::orderBy("id","desc")->first();
if($newJob->id!=$oldJob->id){
DB::beginTransaction();
try{
//删除原来的job
if($id){
if($userTask->job_id){
Jobs::find($userTask->job_id)->delete();
}
//兼容处理原来的数据没有job_id
$userTask->job_id=Jobs::orderBy("id","desc")->value("id");
}
if(!$id){
$userTask->job_id=Jobs::orderBy("id","desc")->value("id");
}
$userTask->save();
DB::commit();
}
catch(\Exception $e){
DB::rollBack();
Jobs::orderBy("id","desc")->first()->delete();
return back()->with([
'message' => $e->getMessage(),
]);
}
}
if($newJob->id==$oldJob->id){
return back()->with([
'message' => 'save task failed',
]);
}
}
当然这里还考虑到第一次投递的时候是否成功创建到job的情况下,前番是没有考虑到这个问题的。
关键字词:laravel11,laravel,inertia,back
相关文章
- TaskController重构到repo中(解决队列的delay无效问题
- 编辑Task相关的数据验证及权限(laravel11队列关联用户
- Task编辑保存相关的逻辑(laravel11表单请求的验证消息
- Task标记完成的逻辑、新建Task相关的数据验证及权限(la
- 列出已完成和未完成的Task(laravel11队列中job完成的a
- 新建Task相关的逻辑(laravel11队列的实现)
- SOC原则与repository设计模式(laravel11)
- 项目显示相关的逻辑、resource路由与resource control
- 权限与数据归属问题的几个方法(laravel11)
- laravel11编辑项目的数据验证逻辑、同一页面多表单错