Событие forceDeleting
Событие forceDeleting срабатывает перед выполнением операции принудительного удаления модели с использованием метода forceDelete. Оно позволяет выполнить дополнительные проверки, записать логи или полностью отменить удаление. Если обработчик события вернёт false, операция удаления будет прервана. Событие относится к Eloquent-моделям и позволяет контролировать процесс принудительного удаления на уровне модели.
Синтаксис
Для использования события forceDeleting необходимо зарегистрировать обработчик в модели или через наблюдатель. Синтаксис регистрации выглядит следующим образом:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesLog;
Article::forceDeleting(function ($article) {
Log::info("Article {$article->id} is being force deleted");
});
?>
Пример
Давайте создадим модель с обработчиком события forceDeleting, который логирует информацию о принудительном удалении записи:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesLog;
class Article extends Model
{
protected $fillable = ['title', 'content', 'status'];
protected static function booted()
{
static::forceDeleting(function ($article) {
Log::info("Force deleting article with ID: {$article->id}");
Log::info("Article title: {$article->title}");
if ($article->status === 'protected') {
Log::warning("Cannot force delete protected article");
return false;
}
});
}
}
?>
Пример
Теперь выполним принудительное удаление модели и посмотрим на результат:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function deleteArticle($id)
{
$article = Article::withTrashed()->find($id);
if ($article && $article->trashed()) {
$article->forceDelete();
echo "Article with ID $id was force deleted";
} else {
echo "Article not found or not soft deleted";
}
}
}
?>
Результат выполнения кода:
"Article with ID 5 was force deleted"
Пример
Рассмотрим пример, где обработчик события предотвращает принудительное удаление модели с определённым статусом:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $fillable = ['name', 'email', 'is_admin'];
protected static function booted()
{
static::forceDeleting(function ($user) {
if ($user->is_admin) {
echo "Cannot force delete admin user";
return false;
}
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateHttpRequest;
class UserController extends Controller
{
public function forceDeleteUser($id)
{
$user = User::withTrashed()->find($id);
if ($user) {
$user->forceDelete();
echo "User was force deleted";
} else {
echo "User not found";
}
}
}
?>
Если попытаться принудительно удалить администратора, результатом будет:
"Cannot force delete admin user"
Смотрите также
-
событие
deleting,
которое возникает перед мягким удалением модели -
событие
forceDeleted,
которое возникает после принудительного удаления модели -
событие
trashed,
которое возникает при мягком удалении модели -
метод
forceDelete,
который выполняет принудительное удаление модели