Installation:
composer require apie/faker
Basic Integration:
use Apie\Faker\ApieObjectFaker;
use Faker\Factory;
$faker = Factory::create();
$faker->addProvider(ApieObjectFaker::createWithDefaultFakers($faker));
First Use Case:
Generate a random User entity with populated value objects:
$user = $faker->fakeClass(User::class);
Documentation section for setup and basic usage.tests/ directory in the monorepo for practical use cases.Entity/Value Object Generation:
$faker->fakeClass(ClassName::class) to generate fully populated objects.$order = $faker->fakeClass(Order::class); // Generates Order with random OrderId, Customer, Items, etc.
Value Object Handling:
Email, PhoneNumber), the package auto-generates valid values using their regex patterns.$email = $faker->fakeClass(Email::class); // Auto-generates a valid email string.
Custom Fakers:
ApieClassFaker for domain-specific logic:
$faker->addProvider(new SpecificClassFaker());
$customVo = $faker->fakeClass(SpecificValueObject::class);
Static createRandom Methods:
[FakeMethod("createRandom")] to avoid custom fakers:
#[FakeMethod("createRandom")]
class Age implements ValueObjectInterface {
public static function createRandom(Generator $generator): self {
return new self($generator->numberBetween(18, 99));
}
}
fakeClass() in unit tests to generate test data:
public function testUserCreation() {
$user = $faker->fakeClass(User::class);
$this->assertInstanceOf(FirstName::class, $user->firstName());
}
DatabaseSeeder for test databases:
public function run() {
$faker = Factory::create();
$faker->addProvider(ApieObjectFaker::createWithDefaultFakers($faker));
User::factory()->createMany(
collect(range(1, 10))->map(fn(_) => $faker->fakeClass(User::class))
);
}
$response = $faker->fakeClass(OrderResponse::class);
$this->json('POST', '/orders', $response->toArray());
Circular Dependencies:
User has Address, Address has User), the faker may hang or fail.Regex Validation:
^[A-Z]{2}-\d{4}$) may fail if the faker’s default strings don’t match.ApieObjectFaker to override regex generation:
$faker->addProvider(new class($faker) extends ApieObjectFaker {
protected function generateStringWithRegex(string $regex): string {
return 'AB-1234'; // Hardcoded fallback
}
});
Attribute Parsing:
[FakeMethod] attribute must be on the class, not the method. Misplacement causes silent failures.#[FakeMethod("createRandom")]
class MyVo { ... } // Correct
Performance:
$cachedFaker = new ApieObjectFaker($faker);
$faker->addProvider($cachedFaker);
$faker->seed(1234); // Ensures reproducible "random" data.
fakeClass() to log generation:
$faker->fakeClass = function($class) {
\Log::info("Generating $class");
return parent::fakeClass($class);
};
ApieObjectFaker::supports() to verify if a class is faked:
if (!ApieObjectFaker::supports($faker, new ReflectionClass(MyClass::class))) {
throw new \RuntimeException("No faker for MyClass");
}
Custom Providers: Add domain-specific fakers globally:
$faker->addProvider(new class($faker) implements ApieClassFaker {
public function supports(ReflectionClass $class): bool {
return $class->implementsInterface(UserInterface::class);
}
public function fakeFor(Generator $generator, ReflectionClass $class): UserInterface {
return new User($generator->fakeClass(FirstName::class), ...);
}
});
Override Default Fakers: Replace the default provider entirely:
$faker->addProvider(new class($faker) extends ApieObjectFaker {
protected function getDefaultFakers(): array {
return [new CustomStringFaker(), ...parent::getDefaultFakers()];
}
});
Dynamic Fake Methods: Use attributes to conditionally enable faking:
#[FakeMethod("createRandom", condition: fn(Generator $g) => $g->boolean(70))]
class Discount implements ValueObjectInterface { ... }
// Only 70% chance to use createRandom().
Laravel Service Provider:
Register the faker globally in AppServiceProvider:
public function boot() {
$faker = Factory::create();
$faker->addProvider(ApieObjectFaker::createWithDefaultFakers($faker));
app()->singleton('faker', fn() => $faker);
}
Then inject via constructor:
public function __construct(private Faker\Generator $faker) {}
How can I help you explore Laravel packages today?