如果先前的任务尚未完成,如何实施Laravel中间件来保护任务

时间:2018-10-30 19:20:13

标签: php laravel laravel-5

我正在构建任务应用程序。 它具有任务表:

tasks
--------
id
title
description

,还有user_tasks表,该表显示已完成任务的用户

user_tasks
--------
id
task_id
user_id

任务模型具有显示由用户完成的任务的方法

public function answered()
{
   return $this->hasOne('App\UserTask')->where('user_id', Auth::id());
}

因此,我的目标是开发一种中间件,以保护未完成的下一个任务(如果未针对特定用户执行)。如果用户未使用 id-1 完成任务,则无法使用 id-2 来启动任务。

1 个答案:

答案 0 :(得分:0)

查看文档。 It's really clear

生成您的中间件

php artisan make:middleware CheckIfUserHasPendingTasks

自定义您的中间件

app / Http / Middleware / CheckIfUserHasPendingTasks.php

<?php

namespace App\Http\Middleware;

use Closure;
use App\Task;
use App\UserTask;

class CheckIfUserHasPendingTasks
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $id = auth()->id();
        $last_task = Task::where('user_id', $id)->lastest()->first();
        $last_completed_task = UserTask::where('user_id', $id)->lastest()->first();

        if ( ! $last_task->id == $last_completed_task->task_id)
        {
            abort(403, 'The user has pending tasks.');
        }

        return $next($request);
    }
}

注册您的中间件

app / Http / Kernel.php

protected $routeMiddleware = [
    // ...
    'task.check' => \App\Http\Middleware\CheckIfUserHasPendingTasks::class, // <--
];

应用您的中间件

routes / api.php //或 routes / web.php

Route::post('a/cool/route', 'a/cool/controller@aFancyMethod')
      ->middleware('task.check'); // <--

观察

您怎么知道哪个Task属于特定的User?我认为user_id应该存储在Task模型中(除非UserTask建立多对多关系(?)