Метод restore
Метод restore класса Policy применяется для проверки права пользователя на восстановление мягко удаленной модели. Первым параметром передается текущий аутентифицированный пользователь, вторым - экземпляр модели, которую планируется восстановить. Метод должен возвращать true, если пользователь имеет право на восстановление, и false в противном случае.
Синтаксис
<?php
class PostPolicy
{
public function restore(User $user, Post $post): bool
{
// Logic for restoring soft-deleted model
}
}
?>
Пример
Давайте создадим политику для модели Post, которая разрешает восстановление только автору записи:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsPost;
class PostPolicy
{
public function restore(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
}
?>
Теперь зарегистрируем политику в сервис-провайдере:
<?php
namespace AppProviders;
use AppModelsPost;
use AppPoliciesPostPolicy;
use IlluminateSupportServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Post::class => PostPolicy::class,
];
public function boot(): void
{
$this->registerPolicies();
}
}
?>
Пример
Давайте используем метод restore в контроллере для проверки права на восстановление:
<?php
namespace AppHttpControllers;
use AppModelsPost;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
class PostController extends Controller
{
public function restore(Request $request, $id)
{
$post = Post::withTrashed()->find($id);
if ($post && Auth::user()->can('restore', $post)) {
$post->restore();
$res = "Post restored successfully";
} else {
$res = "You do not have permission to restore this post";
}
echo $res;
}
}
?>
Результат выполнения кода при успешном восстановлении:
"Post restored successfully"
Результат выполнения кода при отсутствии прав:
"You do not have permission to restore this post"
Пример
Создадим более сложную политику, которая разрешает восстановление только если прошло менее 30 дней с момента удаления:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsPost;
use CarbonCarbon;
class PostPolicy
{
public function restore(User $user, Post $post): bool
{
if ($user->id !== $post->user_id) {
return false;
}
$daysSinceDeleted = Carbon::parse($post->deleted_at)->diffInDays(now());
return $daysSinceDeleted <= 30;
}
}
?>
Смотрите также
-
метод
delete,
который проверяет право на удаление модели -
метод
forceDelete,
который проверяет право на полное удаление модели -
метод
update,
который проверяет право на обновление модели -
метод
authorize,
который используется для авторизации действий в контроллерах