Метод boot
Статический метод boot используется в моделях Eloquent для инициализации событий модели и регистрации глобальных скоупов. Метод вызывается автоматически при первом использовании модели и выполняется один раз за время работы приложения. Внутри метода можно регистрировать обработчики событий модели, такие как creating, updating, deleting и другие. Также здесь можно добавлять глобальные скоупы с помощью метода addGlobalScope.
Синтаксис
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
protected static function boot()
{
parent::boot();
// Регистрация событий
static::creating(function ($model) {
// Логика до создания
});
}
}
?>
Пример
Давайте создадим модель User, которая при создании автоматически устанавливает slug на основе поля name:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportStr;
class User extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->slug = Str::slug($model->name);
});
}
}
?>
Теперь при создании нового пользователя поле slug будет заполняться автоматически:
<?php
namespace AppHttpControllers;
use AppModelsUser;
class UserController extends Controller
{
public function store()
{
$user = new User();
$user->name = 'John Doe';
$user->save();
echo $user->slug;
}
}
?>
Результат выполнения кода:
"john-doe"
Пример
Зарегистрируем несколько событий модели Article. При создании статьи будем устанавливать published_at, а при обновлении проверять изменение статуса:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportCarbon;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($article) {
$article->published_at = Carbon::now();
});
static::updating(function ($article) {
if ($article->isDirty('status') && $article->status === 'published') {
$article->published_at = Carbon::now();
}
});
static::deleting(function ($article) {
// Логика перед удалением
echo 'Deleting article: ' . $article->title;
});
}
}
?>
Теперь при создании и обновлении статьи дата публикации будет устанавливаться автоматически:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function create()
{
$article = new Article();
$article->title = 'My New Article';
$article->status = 'draft';
$article->save();
echo $article->published_at;
}
public function publish($id)
{
$article = Article::find($id);
$article->status = 'published';
$article->save();
echo $article->published_at;
}
}
?>
Результат выполнения кода:
"2026-09-08 10:30:00"
"2026-09-08 10:35:00"
Пример
С помощью метода boot можно также добавлять глобальные скоупы, которые будут автоматически применяться к каждому запросу модели. Например, фильтровать только активные записи:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentBuilder;
class Product extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('active', true);
});
}
}
?>
Теперь любой запрос к модели Product будет автоматически включать условие active = true:
<?php
namespace AppHttpControllers;
use AppModelsProduct;
class ProductController extends Controller
{
public function index()
{
$products = Product::all();
foreach ($products as $product) {
echo $product->name;
}
}
}
?>
Результат выполнения кода:
["Product 1", "Product 2", "Product 3"]
Смотрите также
-
метод
observe,
который позволяет регистрировать наблюдатели модели -
метод
addGlobalScope,
который добавляет глобальные скоупы модели -
метод
withoutEvents,
который выполняет операции без вызова событий -
метод
save,
который сохраняет модель в базу данных