Использование Laravel Policies / Gates .
Конечный результат будет выглядеть так:
public function start(Request $request, Task $task)
{
$this->authorize('start', $task);
// Task is not started. Let's start it...
}
Как ты этого достиг? Это достигается путем определения политики. Давайте создадим TaskPolicy
.
Сгенерируйте его
Запуск в консоли:
php artisan make:policy TaskPolicy
Зарегистрируйся
приложение / Поставщики / AuthServiceProvider.php
protected $policies = [
\App\Task::class => \App\TaskPolicy::class,
];
Настройте его
приложение / Политика / TaskPolicy.php
<?php
namespace App\Policies;
use App\User;
use App\Task;
class TaskPolicy
{
/**
* Determine if the given task can be started/claimed by the user.
*
* @param \App\User $user
* @param \App\Task $task
* @return bool
*/
public function start(User $user, Task $task)
{
// do your checks here.. you have access to the authenticated user and task
return !$task->isStarted();
}
}
Применить это
Как уже упоминалось в начале:
public function start(Request $request, Task $task)
{
$this->authorize('start', $task);
// Task is not started. Let's start it...
}
Проверьте документацию для получения дополнительной информации. Возможно, вы захотите использовать Гейтс, если вы делаете это только один раз.
Эта ошибка будет автоматически возвращена как json
или html
, если авторизация не удалась. Он вернет 403
ошибка.
EDIT
Конечно, вы можете по-разному обрабатывать авторизацию в вашем контроллере.
Вместо $this->authorize('start', $task)
вы можете сделать:
if (\Auth::user()->cannot('start', $task) ) {
}
Более того, в вашем виде лезвия я предполагаю, что у вас есть что-то вроде этого
<form method="post" action="route-here">
<button type="submit">Start Task</button>
</form>
что вы можете сделать, это обернуть это @can .. @ endcan:
@can('start', @task)
<form method="post" action="route-here">
<button type="submit">Start Task</button>
</form>
@endcan
Таким образом, пользователь не увидит кнопку, если не сможет запустить задачу.