directorytree/dummy
directorytree/dummy is a Laravel/PHP package providing a lightweight dummy/test utility for generating placeholder data and fixtures. Useful for local development, demos, and automated tests where realistic sample content is needed quickly and consistently.
Installation:
composer require directorytree/dummy
orchestra/testbench is needed for Laravel-specific testing.Basic Instantiation:
use DirectoryTree\Dummy\Dummy;
$dummy = new Dummy();
First Use Case: Generate a Single Fake Model
$user = $dummy->make('App\Models\User', [
'name' => 'Test User',
'email' => 'test@example.com'
]);
App\Models\User with your Eloquent model or class name.First Use Case: Generate Multiple Fake Models
$users = $dummy->times(5)->make('App\Models\User');
First Use Case: Use with Laravel’s HasFactory (if applicable)
use DirectoryTree\Dummy\Concerns\HasFactory;
class User extends Model
{
use HasFactory;
}
// In test:
$user = User::factory()->create();
HasFactory and Arr helper improvements.tests/ directory in the repo for usage patterns.Basic Data Generation
$dummy = new Dummy();
$post = $dummy->make('App\Models\Post', [
'title' => 'Dummy Post',
'content' => 'This is a test post.'
]);
Bulk Data Generation
$posts = $dummy->times(10)->make('App\Models\Post');
Dynamic Attributes with filled()
$user = $dummy->make('App\Models\User');
$user->filled('email', fn() => 'dynamic@example.com');
Integration with Laravel’s HasFactory
// In your model:
use DirectoryTree\Dummy\Concerns\HasFactory;
class User extends Model
{
use HasFactory;
}
// In test:
$user = User::factory()->create();
Stateful Factories (v1.3.0+)
User::factory()
->state(['role' => 'admin'])
->create();
Using with Eloquent Relationships
$user = User::factory()->create();
$user->posts()->saveMany(
Post::factory()->count(3)->create()
);
Customizing Factories via HasFactory
// In model:
public function defineDummy()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
];
}
PestPHP Integration
use DirectoryTree\Dummy\Dummy;
it('creates a user', function () {
$dummy = new Dummy();
$user = $dummy->make('App\Models\User');
expect($user->email)->toBeString();
});
Generating Plain PHP Objects
$dummy = new Dummy();
$data = $dummy->make(stdClass::class, [
'id' => 1,
'name' => 'Test Object'
]);
Using with Collections
$collection = collect($dummy->times(5)->make(stdClass::class));
Custom Faker Providers
$dummy->faker()->addProvider(new CustomFakerProvider());
Non-Stringable Objects in filled() (v2.0.1 Fix)
filled() throws an exception if the attribute holds a non-Stringable object (e.g., DateTime, Carbon).filled() are compatible or cast them:
$user->filled('created_at', fn() => now()->format('Y-m-d'));
Late Static Binding in HasFactory (v1.6.1 Fix)
HasFactory may fail if not bound correctly.static:: or ensure proper closure binding:
public function defineDummy()
{
return [
'name' => static::faker()->name,
];
}
Laravel-Specific Assumptions
Arr::get() assume Laravel’s Arr helper (v1.3.1+).array_key_first() or similar:
// Non-Laravel alternative:
$value = array_key_first($array) ?: null;
Dynamic States Overhead
No Built-in Database Seeding
create() for Eloquent).$user = User::factory()->create(); // Persists to DB
Inspect Generated Data
$dummy = new Dummy();
$data = $dummy->make('App\Models\User');
dd($data->toArray()); // Debug output
Check Faker Providers
$dummy->faker()->addProvider(new CustomProvider());
Validate HasFactory Definitions
defineDummy() method:
public function defineDummy()
{
return [
'name' => $this->faker->name,
// Ensure all required fields are defined
];
}
Custom Faker Providers
use Faker\Provider\Base as FakerProvider;
class CustomProvider extends FakerProvider
{
public function customField()
{
return 'custom_value';
}
}
$dummy->faker()->addProvider(new CustomProvider());
Override Default Attributes
$dummy->make('App\Models\User', [
'name' => 'Override Name',
'email' => 'override@example.com'
]);
Dynamic Factory States
User::factory()
->state(['role' => 'admin'])
->state(fn(array $attributes) => [
'is_active' => $attributes['role'] === 'admin' ? true : false,
])
->create();
Integration with Laravel’s Fake
use Illuminate\Foundation\Testing\WithFaker;
class UserFactoryTest extends TestCase
{
use WithFaker;
public function testFactory()
{
$user = User::factory()->create();
$this->assertEquals('test@example.com', $user->email);
}
}
Laravel 13+ Compatibility
Generic Types (v1.5.1)
$dummy->make(stdClass::class, [
'id' => 1,
'name' => 'Test',
]);
Factory Method Parity (v1.5.0)
factory() methods for consistency:
$user = User::factory()->create(); // Works if using HasFactory
Avoid Overusing Dynamic States
Cache Factory Definitions
Use times() Efficiently
$dummy->times(100)->make('App\Models\User'); // Better than looping manually
How can I help you explore Laravel packages today?