Как внедрить Laravel Middleware для защиты задачи, если предыдущая не выполнена - PullRequest
0 голосов
/ 30 октября 2018

Я создаю приложение задачи. Имеет таблицу задач:

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 голосов
/ 30 октября 2018

Просмотрите документацию. Это действительно ясно .

Создайте свое промежуточное ПО

php artisan make:middleware CheckIfUserHasPendingTasks

Настройте ваше промежуточное ПО

приложение / Http / Промежуточное / 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);
    }
}

Зарегистрируйте ваше промежуточное ПО

приложение / Http / Kernel.php

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

Примените свое промежуточное программное обеспечение

маршруты / api.php // или маршруты / web.php

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

Наблюдение

Откуда вы знаете, какой Task принадлежит определенному User? Я думаю, что user_id следует хранить в модели Task (если только User и Task не устанавливают отношение многие ко многим (?))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...