Событие updated
Событие updated срабатывает после того, как модель была успешно обновлена в базе данных. Это событие является частью системы событий Eloquent и позволяет выполнять дополнительный код после изменения записи. Событие вызывается только в том случае, если модель действительно была обновлена и изменения сохранены. Первым параметром в метод передаётся экземпляр обновлённой модели.
Синтаксис
Для работы с событием updated необходимо определить его в свойстве $dispatchesEvents модели или использовать статический метод updated:
<?php
use AppModelsPost;
Post::updated(function ($post) {
// Handle updated event
});
?>
Пример
Давайте создадим модель Post и определим событие updated в свойстве $dispatchesEvents. При обновлении записи мы будем логировать это действие:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use AppEventsPostUpdated;
class Post extends Model
{
protected $dispatchesEvents = [
'updated' => PostUpdated::class,
];
}
?>
Теперь создадим класс события PostUpdated:
<?php
namespace AppEvents;
use IlluminateFoundationEventsDispatchable;
use AppModelsPost;
class PostUpdated
{
use Dispatchable;
public $post;
public function __construct(Post $post)
{
$this->post = $post;
}
}
?>
И слушатель для обработки события:
<?php
namespace AppListeners;
use AppEventsPostUpdated;
class LogPostUpdate
{
public function handle(PostUpdated $event)
{
$post = $event->post;
// Log post update action
$res = "Post updated: " . $post->id;
echo $res;
}
}
?>
Пример обновления записи в контроллере:
<?php
namespace AppHttpControllers;
use AppModelsPost;
use AppEventsPostUpdated;
class PostController extends Controller
{
public function update()
{
$post = Post::find(1);
$post->title = 'article updated';
$post->save();
$res = $post->title;
echo $res;
}
}
?>
Результат выполнения кода:
"article updated"
"Post updated: 1"
Пример
Давайте используем статический метод updated для обработки события. В этом примере после обновления модели мы очистим кеш:
<?php
namespace AppProviders;
use IlluminateFoundationSupportProvidersEventServiceProvider;
use AppModelsPost;
class EventServiceProvider extends EventServiceProvider
{
public function boot()
{
Post::updated(function ($post) {
// Clear cache for this post
$res = "Cache cleared for post: " . $post->id;
echo $res;
});
}
}
?>
Теперь обновим модель через метод update:
<?php
use AppModelsPost;
$post = Post::find(2);
$post->update([
'text' => 'New content for article'
]);
$res = $post->text;
echo $res;
?>
Результат выполнения кода:
"New content for article"
"Cache cleared for post: 2"
Пример
Давайте создадим модель Category и используем событие updated для отправки уведомления администратору при обновлении категории:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Category extends Model
{
protected $dispatchesEvents = [
'updated' => 'AppEventsCategoryUpdated',
];
public function getCategoryName()
{
return $this->name;
}
}
?>
Создадим класс события:
<?php
namespace AppEvents;
use IlluminateFoundationEventsDispatchable;
use AppModelsCategory;
class CategoryUpdated
{
use Dispatchable;
public $category;
public $oldName;
public $newName;
public function __construct(Category $category)
{
$this->category = $category;
$this->oldName = $category->getOriginal('name');
$this->newName = $category->name;
}
}
?>
И слушатель для отправки уведомления:
<?php
namespace AppListeners;
use AppEventsCategoryUpdated;
class SendCategoryUpdateNotification
{
public function handle(CategoryUpdated $event)
{
$old = $event->oldName;
$new = $event->newName;
$id = $event->category->id;
$res = "Category $id updated: $old -> $new";
echo $res;
}
}
?>
Пример обновления категории:
<?php
use AppModelsCategory;
$category = Category::find(1);
$category->name = 'new category';
$category->save();
$res = $category->getCategoryName();
echo $res;
?>
Результат выполнения кода:
"new category"
"Category 1 updated: old category -> new category"