Событие retrieved
Событие retrieved относится к событиям модели Eloquent и срабатывает в момент, когда запись уже выбрана из базы данных, но ещё не передана в приложение. Это событие вызывается только при выполнении запросов на чтение, таких как get, first, find и других. В отличие от событий creating или updating, которые связаны с изменением данных, retrieved позволяет перехватывать именно процесс получения данных.
Событие retrieved не принимает дополнительных параметров, кроме самой модели, и не может прервать выполнение запроса. Оно предназначено для выполнения побочных действий после извлечения записи, таких как логирование, модификация атрибутов на лету или инициализация дополнительных данных.
Синтаксис
<?php
use AppModelsArticle;
Article::retrieved(function ($article) {
// Действия после извлечения записи
});
?>
Пример
Давайте добавим логирование каждого извлечения статьи из базы данных:
<?php
namespace AppProviders;
use AppModelsArticle;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Article::retrieved(function ($article) {
Log::info('Article retrieved: ' . $article->id);
});
}
}
?>
Результат выполнения кода в файле логов:
"Article retrieved: 1"
"Article retrieved: 2"
Пример
Давайте модифицируем атрибут модели после её извлечения, добавив префикс к заголовку:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function booted()
{
static::retrieved(function ($article) {
$article->title = 'Article: ' . $article->title;
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$article = Article::find(1);
echo $article->title;
}
}
?>
Результат выполнения кода:
"Article: article 1"
Пример
Давайте использовать событие retrieved для подсчёта количества обращений к определённой модели:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesCache;
class Article extends Model
{
protected static function booted()
{
static::retrieved(function ($article) {
$key = 'article_views_' . $article->id;
Cache::increment($key);
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesCache;
class ArticleController extends Controller
{
public function show($id)
{
$article = Article::find($id);
$views = Cache::get('article_views_' . $id, 0);
echo "Views: " . $views;
}
}
?>
Результат выполнения кода при первом обращении:
"Views: 1"
Результат выполнения кода при втором обращении:
"Views: 2"