Create fake entities based on your classes
MIT License
This package will help you generate fake entities and persist them to your ORM.
<?php
use Butschster\EntityFaker\LaminasEntityFactory;
use Laminas\Hydrator\ReflectionHydrator;
use Faker\Factory as Faker;
$factory = new \Butschster\EntityFaker\Factory(
new LaminasEntityFactory(
new ReflectionHydrator()
),
Faker::create()
);
class User
{
private string $id;
private string $username;
private string $email;
public function __construct(string $id, string $username, string $email)
{
$this->id = $id;
$this->username = $username;
$this->email = $email;
}
}
class SuperUser extends User
{
private bool $isAdmin = false;
public function __construct(string $id, string $username, string $email, bool $isAdmin)
{
parent::__construct($id, $username, $email);
$this->isAdmin = $isAdmin;
}
}
$factory->define(User::class, function (Faker $faker, array $attributes) {
return [
'id' => $faker->uuid,
'username' => $faker->username,
'email' => $faker->email
];
});
$factory->define(SuperUser::class, function (Faker $faker, array $attributes) use($factory) {
$userAttributes = $factory->raw(User::class);
return $userAttributes + [
'isAdmin' => $faker->boolean
];
});
$user = $factory->of(User::class)->create();
//class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
//}
$users = $factory->of(User::class)->times(10)->create();
//[
// class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
// },
// ...
//]
$user = $factory->of(User::class)->create([
'email' => '[email protected]'
]);
//class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
//}
$user = $factory->of(User::class)->make();
//class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
//}
$users = $factory->of(User::class)->times(10)->make();
//[
// class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
// },
// ...
//]
$user = $factory->of(User::class)->make([
'email' => '[email protected]'
]);
//class User {
// private string $id = "0b13e52d-b058-32fb-8507-10dec634a07c";
// private string $username = "zetta86";
// private string $email = "[email protected]";
//}
$attributes = $factory->of(SuperUser::class)->raw();
//[
// 'id' => "0b13e52d-b058-32fb-8507-10dec634a07c",
// 'username' => 'zetta86',
// 'email' => '[email protected]',
//]
$attributes = $factory->of(SuperUser::class)->raw([
'email' => '[email protected]'
]);
//[
// 'id' => "0b13e52d-b058-32fb-8507-10dec634a07c",
// 'username' => 'zetta86',
// 'email' => '[email protected]',
//]
$repository = $factory->make(1000);
$seeds = $repository->get(User::class)->random(100);
$seeds = $repository->get(SuperUser::class)->take(50);
$repository = $factory->raw(1000);
$seeds = $repository->get(User::class)->random(100);
$seeds = $repository->get(SuperUser::class)->take(50);
$path = $factory->of(SuperUser::class)->times(1000)->export('path/to/store');
// path/to/store/SuperUser.php
$repository = $factory->export('path/to/store', 1000);
$seeds = $repository->get(User::class)->random(100);
You can define your own EntityBuilder class with custom persist logic.
use Butschster\EntityFaker\EntityFactoryInterface;
use Faker\Factory as Faker;
use Cycle\ORM\ORMInterface;
use Cycle\ORM\TransactionInterface;
class CycleOrmEntityFactory implements EntityFactoryInterface
{
private array $afterCreation = [];
private array $beforeCreation = [];
protected ORMInterface $orm;
protected Transaction $transaction;
public function __construct(ORMInterface $orm)
{
$this->orm = $orm;
$this->beforeCreation(function () {
$this->transaction = new Transaction($this->orm);
});
$this->afterCreation(function () {
$this->transaction->run();
});
}
public function store(object $entity): void
{
$this->transaction->persist($entity);
}
public function hydrate(object $entity, array $data): object
{
return $this->orm->getMapper($entity)->hydrate($entity, $data);
}
/**
* Add a callback to run after creating an entity or array of entities.
* @param callable $callback
*/
public function afterCreation(callable $callback): void
{
$this->afterCreation[] = $callback;
}
public function afterCreationCallbacks(): array
{
return $this->afterCreation;
}
/**
* Add a callback to run before creating an entity or array of entities.
* @param callable $callback
*/
public function beforeCreation(callable $callback): void
{
$this->beforeCreation[] = $callback;
}
public function beforeCreationCallbacks(): array
{
return $this->beforeCreation;
}
}
$factory = new \Butschster\EntityFaker\Factory(
new CycleOrmEntityFactory(...),
Faker::create()
);