Событие restoring
Событие restoring является событием Eloquent, которое срабатывает непосредственно перед тем, как модель будет восстановлена из состояния мягкого удаления. Это событие позволяет выполнить дополнительные действия или проверки до того, как модель будет восстановлена. Событие принимает экземпляр модели в качестве единственного параметра и работает в паре с событием restored, которое вызывается после успешного восстановления. Если в обработчике события вернуть false, процесс восстановления будет прерван.
Синтаксис
<?php
Model::restoring(function ($model) {
// логика перед восстановлением
});
?>
Метод применяется к модели и принимает замыкание или имя класса слушателя. Первым параметром передаётся экземпляр модели.
Пример
Давайте зарегистрируем обработчик события restoring в методе booted модели, чтобы логировать факт восстановления:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
class Article extends Model
{
use SoftDeletes;
protected static function booted()
{
static::restoring(function ($article) {
Log::info("Article restoring: " . $article->id);
});
}
}
?>
Теперь выполним восстановление модели:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function restore($id)
{
$article = Article::onlyTrashed()->find($id);
$res = $article->restore();
echo $res;
}
}
?>
Результат выполнения кода:
true
При этом в логах будет запись о восстановлении.
Пример
Давайте используем событие restoring для проверки условия перед восстановлением и прервём процесс, если условие не выполняется:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
class Article extends Model
{
use SoftDeletes;
protected static function booted()
{
static::restoring(function ($article) {
$article->status = 'pending';
if ($article->title === '') {
return false;
}
});
}
}
?>
Попробуем восстановить статью с пустым заголовком:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function restore($id)
{
$article = Article::onlyTrashed()->find($id);
$res = $article->restore();
echo $res;
}
}
?>
Результат выполнения кода:
false
Восстановление не произойдёт, так как обработчик вернул false.
Пример
Давайте зарегистрируем несколько слушателей для события restoring с помощью метода observe:
<?php
namespace AppObservers;
use AppModelsArticle;
class ArticleObserver
{
public function restoring(Article $article)
{
$article->restored_at = now();
}
public function restored(Article $article)
{
$article->update(['status' => 'published']);
}
}
?>
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
use AppObserversArticleObserver;
class Article extends Model
{
use SoftDeletes;
protected static function booted()
{
static::observe(ArticleObserver::class);
}
}
?>
Теперь выполним восстановление:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function restore($id)
{
$article = Article::onlyTrashed()->find($id);
$article->restore();
$res = $article->toArray();
echo $res;
}
}
?>
Результат выполнения кода:
{"id":1,"title":"article","status":"published","restored_at":"2024-01-15 10:30:00","deleted_at":null}
Перед восстановлением поле restored_at заполняется текущей датой, а после восстановления статус модели меняется на published.