Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Alice Laravel Package

nelmio/alice

nelmio/alice is a PHP fixtures generator for quickly creating realistic test data. Define objects and relations in YAML, JSON, or PHP, leverage Faker providers, and load datasets into your app for functional and integration testing.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require --dev nelmio/alice
    

    Add to composer.json under require-dev to avoid production bloat.

  2. Basic Usage: Define a fixture in a PHP file (e.g., database/fixtures/UserFixture.php):

    <?php
    use Nelmio\Alice\Fixtures;
    use App\Models\User;
    
    $faker = Fixtures::faker();
    
    yield User::create([
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => bcrypt('password'),
    ]);
    
  3. Load Fixtures: Use the Fixtures facade in a test or migration:

    use Nelmio\Alice\Fixtures;
    
    Fixtures::load([__DIR__.'/UserFixture.php']);
    
  4. First Use Case: Populate a database for testing or development:

    php artisan db:seed --class=LoadFixtures --force
    

    (Create a custom seeder extending DatabaseSeeder.)


Implementation Patterns

Fixture Organization

  • Modular Fixtures: Group related fixtures by domain (e.g., UserFixtures.php, PostFixtures.php). Use Fixtures::load() with an array of paths for bulk loading.

  • Dependencies: Reference existing fixtures in new ones:

    yield Post::create([
        'title' => $faker->sentence,
        'user_id' => $user->id, // $user is from a previously yielded fixture
    ]);
    
  • Parameterized Fixtures: Pass variables to fixtures for dynamic data:

    $users = Fixtures::load([__DIR__.'/UserFixture.php'], ['count' => 5]);
    

Integration with Laravel

  • Database Transactions: Wrap fixture loading in a transaction for rollback safety:

    DB::transaction(function () {
        Fixtures::load([__DIR__.'/UserFixture.php']);
    });
    
  • Test Integration: Use in phpunit.xml or TestCase setup:

    protected function setUp(): void
    {
        parent::setUp();
        Fixtures::load([__DIR__.'/fixtures/*.php']);
    }
    
  • Custom Faker Providers: Extend Faker with domain-specific providers:

    Faker::addProvider(new CustomProvider($faker));
    

Advanced Patterns

  • Fixture Reuse: Define reusable fixture templates in a base file (e.g., BaseFixtures.php) and extend them.

  • Conditional Fixtures: Use Faker’s logic to conditionally yield data:

    if ($faker->boolean(50)) {
        yield Comment::create(['content' => $faker->text]);
    }
    
  • Relationships: Chain fixtures to build complex relationships:

    yield Category::create(['name' => $faker->word]);
    yield Product::create([
        'name' => $faker->word,
        'category_id' => $category->id,
    ]);
    

Gotchas and Tips

Common Pitfalls

  • Duplicate Data: Use $faker->unique() for fields like email or slug to avoid conflicts. Example:

    'email' => $faker->unique()->safeEmail,
    
  • Foreign Key Constraints: Ensure parent records exist before yielding child records (e.g., User before Post).

  • Transaction Deadlocks: Avoid long-running fixture loads in transactions. Break into smaller batches if needed.

  • Faker Seed Consistency: Set a fixed seed for reproducible data:

    $faker = Fixtures::faker()->seed(1234);
    

Debugging Tips

  • Fixture Validation: Use Laravel’s tinker to inspect generated data:

    php artisan tinker
    User::all()->first();
    
  • Logging: Enable Faker’s debug mode for verbose output:

    $faker->debug();
    
  • Error Handling: Wrap fixture loading in a try-catch to handle exceptions gracefully:

    try {
        Fixtures::load([__DIR__.'/UserFixture.php']);
    } catch (\Exception $e) {
        Log::error("Fixture load failed: " . $e->getMessage());
    }
    

Configuration Quirks

  • Custom Model Factories: If using Laravel’s factories, ensure they align with your fixture data to avoid conflicts.

  • Performance: For large datasets, use Fixtures::load() with a generator to avoid memory issues:

    yield from Fixtures::load([__DIR__.'/UserFixture.php'], ['count' => 1000]);
    
  • Extension Points: Override Faker’s locale or providers globally in config/app.php:

    'faker_locale' => 'fr_FR',
    

Pro Tips

  • Fixture Documentation: Add PHPDoc comments to fixtures for clarity:

    /**
     * Generates 5 active users with random emails.
     */
    yield User::create([...]);
    
  • Fixture Versioning: Use semantic versioning for fixtures (e.g., v1/UserFixture.php) to track changes.

  • Combine with Laravel Factories: Use create() with Faker for hybrid approaches:

    yield User::factory()->create([
        'email' => $faker->unique()->safeEmail,
    ]);
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui