Метод forceDelete
Метод forceDelete класса Policy применяется для проверки прав пользователя на принудительное удаление модели, которая ранее была удалена через мягкое удаление (Soft Deletes). Метод принимает два параметра: текущего аутентифицированного пользователя и экземпляр модели, которую необходимо окончательно удалить. Возвращает значение bool - true, если пользователь имеет право на принудительное удаление, и false в противном случае.
Синтаксис
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Article;
class ArticlePolicy
{
public function forceDelete(User $user, Article $article): bool
{
// Логика проверки прав
}
}
?>
Пример
Создадим политику для модели Article, которая разрешает принудительное удаление только администраторам:
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Article;
class ArticlePolicy
{
public function forceDelete(User $user, Article $article): bool
{
return $user->role === 'admin';
}
}
?>
Пример
Используем метод в контроллере для проверки прав перед окончательным удалением статьи:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
class ArticleController extends Controller
{
public function forceDelete(Request $request, Article $article)
{
if (Gate::denies('forceDelete', $article)) {
abort(403, 'У вас нет прав на принудительное удаление этой статьи');
}
$article->forceDelete();
return redirect()->route('articles.index')
->with('success', 'Статья удалена окончательно');
}
}
?>
Пример
Проверим работу политики в Blade-шаблоне для отображения кнопки принудительного удаления только для авторизованных администраторов:
@can('forceDelete', $article)
<form action="{{ route('articles.force-delete', $article) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">
Удалить окончательно
</button>
</form>
@endcan
Пример
Более сложный пример - разрешаем принудительное удаление только автору статьи или администратору:
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Article;
class ArticlePolicy
{
public function forceDelete(User $user, Article $article): bool
{
// Разрешаем админу или автору статьи
return $user->role === 'admin' || $user->id === $article->user_id;
}
}
?>