РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
328 of 1392 menu

Событие 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"

Смотрите также

  • событие created,
    которое вызывается после сохранения новой модели
  • событие updating,
    которое вызывается перед обновлением существующей модели
  • событие saving,
    которое вызывается перед сохранением модели как при создании, так и при обновлении
  • метод save,
    который сохраняет модель в базе данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить