Метод 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,
который определяет право на полное удаление модели