РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
751 of 1392 menu

Метод delete

Метод delete класса Policy определяет, разрешено ли пользователю удаление конкретной модели. Он вызывается автоматически при использовании фасада Gate, хелпера can или метода authorize в контроллере. Метод принимает два параметра: текущего аутентифицированного пользователя и экземпляр модели, которую собираются удалить. Возвращает true, если пользователь имеет право на удаление, и false в противном случае.

Синтаксис

<?php namespace AppPolicies; use AppModelsUser; use AppModelsArticle; class ArticlePolicy { public function delete(User $user, Article $article) { // logic } } ?>

Пример

Давайте создадим политику для модели Article, которая разрешает удаление только автору статьи:

<?php namespace AppPolicies; use AppModelsUser; use AppModelsArticle; class ArticlePolicy { public function delete(User $user, Article $article) { return $user->id === $article->user_id; } } ?>

Теперь проверим работу политики в контроллере:

<?php namespace AppHttpControllers; use AppModelsArticle; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class ArticleController extends Controller { public function destroy(Article $article) { if (Auth::user()->can('delete', $article)) { $article->delete(); echo "Article deleted successfully"; } else { echo "You cannot delete this article"; } } } ?>

Результат выполнения кода для автора статьи:

"Article deleted successfully"

Пример

В политике можно реализовать более сложную логику, например, разрешить удаление администратору или автору статьи:

<?php namespace AppPolicies; use AppModelsUser; use AppModelsArticle; class ArticlePolicy { public function delete(User $user, Article $article) { return $user->id === $article->user_id || $user->role === 'admin'; } } ?>

Использование метода authorize в контроллере:

<?php namespace AppHttpControllers; use AppModelsArticle; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class ArticleController extends Controller { public function destroy(Article $article) { $this->authorize('delete', $article); $article->delete(); return redirect()->route('articles.index') ->with('success', 'Article deleted'); } } ?>

При неудачной попытке удаления метод authorize автоматически выбрасывает исключение:

"IllegalOperationException: This action is unauthorized"

Пример

Для моделей с мягким удалением (Soft Deletes) политика может иметь отдельный метод forceDelete. Но метод delete в этом случае управляет обычным удалением (установкой флага deleted_at):

<?php namespace AppPolicies; use AppModelsUser; use AppModelsArticle; class ArticlePolicy { public function delete(User $user, Article $article) { return $user->id === $article->user_id; } public function forceDelete(User $user, Article $article) { return $user->role === 'admin'; } } ?>

Пример использования в контроллере:

<?php namespace AppHttpControllers; use AppModelsArticle; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class ArticleController extends Controller { public function destroy(Article $article) { if (Auth::user()->can('delete', $article)) { $article->delete(); echo "Article moved to trash"; } else { echo "You cannot delete this article"; } } public function forceDestroy(Article $article) { if (Auth::user()->can('forceDelete', $article)) { $article->forceDelete(); echo "Article permanently deleted"; } else { echo "You cannot permanently delete this article"; } } } ?>

Результат выполнения кода для администратора:

"Article moved to trash" "Article permanently deleted"

Смотрите также

  • метод view,
    который определяет право на просмотр модели
  • метод update,
    который определяет право на обновление модели
  • метод restore,
    который определяет право на восстановление модели
  • метод forceDelete,
    который определяет право на полное удаление модели
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить