adlarge/fixtures-documentation-bundle
Symfony bundle that generates and serves documentation for your fixtures. Builds a JSON dataset and Twig UI with sections, tables, and links between entities, and can expose an action to reload fixtures so testers can inspect and reset test data.
Installation
composer require adlarge/fixtures-documentation-bundle
Add to config/bundles.php (Symfony) or config/app.php (Laravel via bridge):
Adlarge\FixturesDocumentationBundle\AdlargeFixturesDocumentationBundle::class => ['all' => true],
Configuration Publish the default config:
php artisan vendor:publish --tag=adlarge-fixtures-documentation-config
Update config/adlarge_fixtures_documentation.php with your fixture paths and routes.
First Use Case Generate documentation for a single fixture class:
use Adlarge\FixturesDocumentationBundle\Generator\FixtureGenerator;
$generator = new FixtureGenerator();
$generator->generate('App\Fixtures\UserFixture', 'users');
Access the generated JSON at /fixtures-documentation/data.json and Twig template at /fixtures-documentation.
Fixture Generation
$generator->generateEntity($entity, 'section_name');
$generator->generateFixture('App\Fixtures\UserFixture');
$generator->generateAll();
Route Configuration
Add to routes/web.php (Symfony) or routes.php (Laravel):
use Adlarge\FixturesDocumentationBundle\AdlargeFixturesDocumentationBundle;
$bundle->addRoutes($router);
Twig Integration
Extend the default Twig template (templates/AdlargeFixturesDocumentationBundle/default/index.html.twig) to customize rendering:
{% extends 'base.html.twig' %}
{% block body %}
{{ include('AdlargeFixturesDocumentationBundle::default/_fixtures.html.twig', {
fixtures: fixtures,
sections: sections
}) }}
{% endblock %}
Reload Action
Configure a reload route in config/adlarge_fixtures_documentation.php:
reload:
enabled: true
route: 'fixtures_reload'
method: 'POST'
Add a controller to handle reloads:
use Adlarge\FixturesDocumentationBundle\Service\FixtureReloader;
public function reloadFixtures(FixtureReloader $reloader)
{
$reloader->reload();
return redirect()->route('fixtures_documentation');
}
Laravel-Specific Bridge
Use the adlarge/laravel-fixtures-documentation-bridge to integrate with Laravel’s service container:
$this->loadViewsFrom(__DIR__.'/resources/views', 'fixtures-documentation');
$this->app->register(\Adlarge\FixturesDocumentationBundle\Bridge\Laravel\ServiceProvider::class);
Fixture Path Configuration
fixtures_paths in config includes all directories containing your fixture classes.fixtures_paths:
- '%kernel.project_dir%/tests/Fixtures'
- '%kernel.project_dir%/vendor/acme/fixtures'
Entity vs. Fixture Data
getData(), it falls back to entity properties, which may not match test expectations.getData() in your fixture:
public function getData()
{
return [
'email' => $this->faker->unique()->email,
'role' => 'admin',
];
}
Caching Issues
php artisan cache:clear
config/adlarge_fixtures_documentation.php for development:
cache:
enabled: false
Doctrine Fixtures Only
Adlarge\FixturesDocumentationBundle\Generator\FixtureInterface:
class CustomFixture implements FixtureInterface
{
public function getData(): array
{
return [...];
}
}
Twig Template Overrides
default/index.html.twig) to retain functionality.{{ dump(fixtures) }} in Twig to inspect the generated data structure.Verify JSON Output
Check /fixtures-documentation/data.json for errors or missing data. Use:
curl http://localhost/fixtures-documentation/data.json | jq
Log Generation Enable debug mode in config:
debug: true
Logs will appear in var/log/adlarge_fixtures_documentation.log.
Fixture Loading Order Fixtures are processed alphabetically. Use explicit section names to control ordering:
$generator->generateFixture('App\Fixtures\AdminFixture', 'Admins (Priority)');
Custom Data Processors Add a service to transform fixture data before rendering:
# config/services.yaml
Adlarge\FixturesDocumentationBundle\Generator\DataProcessorInterface:
class: App\Service\CustomFixtureDataProcessor
tags: [adlarge.fixtures_documentation.data_processor]
Dynamic Sections Generate sections dynamically based on entity metadata:
use Doctrine\ORM\Mapping\ClassMetadata;
public function getSection(ClassMetadata $metadata): string
{
return $metadata->getReflectionClass()->getShortName();
}
API Endpoint Expose the JSON endpoint for API consumers:
Route::get('/api/fixtures', function () {
return response()->json(file_get_contents(public_path('fixtures-documentation/data.json')));
});
How can I help you explore Laravel packages today?