Событие creating
Событие creating относится к модели Eloquent и срабатывает непосредственно перед тем, как новая запись будет сохранена в базе данных. Это событие является частью жизненного цикла модели и позволяет разработчику выполнить различные операции в момент создания, например, автоматически заполнить поля, провести валидацию данных или установить значения по умолчанию. Событие вызывается только при первом сохранении новой модели через методы save или create, и не срабатывает при обновлении существующих записей.
Для использования события creating необходимо определить его в свойстве $dispatchesEvents модели или использовать наблюдателя (observer). В обработчике события доступна сама модель через параметр, что позволяет модифицировать её атрибуты перед сохранением. Важно отметить, что событие может быть остановлено, если обработчик вернёт false, что предотвратит сохранение модели.
Синтаксис
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $dispatchesEvents = [
'creating' => ArticleCreating::class,
];
}
?>
Можно также использовать замыкание в методе boot модели:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->created_at = now();
});
}
}
?>
Или через наблюдателя:
<?php
namespace AppObservers;
use AppModelsArticle;
class ArticleObserver
{
public function creating(Article $article)
{
$article->created_by = auth()->id();
}
}
?>
Для регистрации наблюдателя в сервис-провайдере:
<?php
namespace AppProviders;
use AppModelsArticle;
use AppObserversArticleObserver;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
Article::observe(ArticleObserver::class);
}
}
?>
Пример использования события creating
Рассмотрим пример, где перед созданием статьи автоматически устанавливается текущая дата и время в поле 'published_at':
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($article) {
$article->published_at = now();
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function store(Request $request)
{
$article = new Article();
$article->title = $request->title;
$article->text = $request->text;
$article->save();
echo "Article created at: " . $article->published_at;
}
}
?>
Результат выполнения кода:
"Article created at: 2026-09-08 10:30:00"
Пример с остановкой сохранения
В некоторых случаях необходимо предотвратить создание записи, если не выполнены определённые условия. В этом примере мы проверяем длину заголовка и блокируем сохранение, если она меньше трёх символов:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($article) {
if (strlen($article->title) < 3) {
return false;
}
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function store()
{
$article = new Article();
$article->title = 'a';
$article->text = 'Short text';
$res = $article->save();
if ($res) {
echo "Article saved successfully";
} else {
echo "Article creation failed";
}
}
}
?>
Результат выполнения кода:
"Article creation failed"
Пример с наблюдателем
Использование наблюдателя позволяет организовать код более чисто, отделяя логику события от модели. В этом примере мы автоматически присваиваем id текущего пользователя при создании статьи:
<?php
namespace AppObservers;
use AppModelsArticle;
class ArticleObserver
{
public function creating(Article $article)
{
$article->user_id = auth()->id();
}
}
?>
<?php
namespace AppProviders;
use AppModelsArticle;
use AppObserversArticleObserver;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
Article::observe(ArticleObserver::class);
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function store()
{
$article = Article::create([
'title' => 'New article',
'text' => 'Lorem ipsum dolor sit amet',
]);
echo "Article created by user: " . $article->user_id;
}
}
?>
Результат выполнения кода:
"Article created by user: 1"