Метод afterMaking
Метод afterMaking класса Factory применяется для регистрации обратного вызова, который будет выполнен после того, как фабрика создаст экземпляр модели с помощью метода make. В отличие от afterCreating, данный метод срабатывает до сохранения модели в базу данных. Обратный вызов получает созданный экземпляр модели в качестве аргумента, что позволяет модифицировать его атрибуты или выполнять дополнительные действия.
Синтаксис
<?php
Factory::afterMaking($callback);
?>
Пример
Давайте создадим фабрику для модели User и зарегистрируем обратный вызов, который преобразует имя пользователя в верхний регистр после создания экземпляра:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'password' => bcrypt('password'),
];
}
public function configure()
{
return $this->afterMaking(function (User $user) {
$user->name = strtoupper($user->name);
});
}
}
?>
Теперь при создании экземпляра с помощью метода make имя пользователя будет автоматически преобразовано в верхний регистр:
<?php
use AppModelsUser;
use DatabaseFactoriesUserFactory;
$user = UserFactory::new()->make();
echo $user->name;
?>
Результат выполнения кода:
"JOHN DOE"
Пример
Давайте используем afterMaking для установки значения поля slug на основе поля title перед сохранением модели:
<?php
namespace DatabaseFactories;
use AppModelsArticle;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class ArticleFactory extends Factory
{
protected $model = Article::class;
public function definition()
{
return [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraphs(3, true),
'status' => 'draft',
'slug' => null,
];
}
public function configure()
{
return $this->afterMaking(function (Article $article) {
if (is_null($article->slug)) {
$article->slug = Str::slug($article->title);
}
});
}
}
?>
При создании экземпляра статьи с помощью метода make, поле slug будет автоматически заполнено:
<?php
use AppModelsArticle;
use DatabaseFactoriesArticleFactory;
$article = ArticleFactory::new()->make();
echo $article->slug;
?>
Результат выполнения кода:
"laravel-eloquent-query-builder"
Смотрите также
-
метод
afterCreating,
который выполняет код после сохранения модели -
метод
make,
который создаёт экземпляр модели без сохранения -
метод
create,
который создаёт и сохраняет модель -
метод
state,
который позволяет задавать состояние модели