prewk/xml-faker
Generate fake XML easily for tests and demos with prewk/xml-faker. Define elements and attributes, create realistic sample documents fast, and avoid hand-writing fixtures. Lightweight helper for PHP projects that need quick XML payloads.
Installation
composer require prewk/xml-faker
Ensure fzaninotto/Faker is also installed (this package depends on it).
Basic Usage
use Prewk\XmlFaker\XmlFaker;
use Faker\Factory as Faker;
$faker = Faker::create();
$xmlFaker = new XmlFaker($faker);
$xml = $xmlFaker->fake('<?xml version="1.0"?><root><user>{$name}</user></root>');
echo $xml;
Outputs:
<?xml version="1.0"?><root><user>John Doe</user></root>
First Use Case Generate fake XML for testing API responses or database seeding:
$fakeXml = $xmlFaker->fake('<response><id>{$id}</id><name>{$name}</name></response>');
Dynamic XML Generation
Use placeholders ({placeholder}) to inject Faker data:
$xmlFaker->fake('<book><title>{$sentence}</title><author>{$name}</author></book>');
Reusable Templates
Store XML templates in a config file (e.g., config/fake_xml.php) and load them dynamically:
$template = config('fake_xml.books');
$xmlFaker->fake($template);
Nested Structures Handle nested XML with recursive placeholders:
$xmlFaker->fake('<catalog><book><title>{$sentence}</title><pages>{$numberBetween(100,500)}</pages></book></catalog>');
Integration with Laravel
Bind the service in AppServiceProvider:
public function register()
{
$this->app->singleton(XmlFaker::class, function ($app) {
return new XmlFaker(Faker::create());
});
}
Inject via constructor or resolve via app():
$xml = app(XmlFaker::class)->fake('<user>{$name}</user>');
Batch Generation Loop to generate multiple fake XML entries:
$users = [];
for ($i = 0; $i < 5; $i++) {
$users[] = $xmlFaker->fake('<user><id>{$unique->number(100)}</id><email>{$email}</email></user>');
}
Placeholder Escaping
If your XML contains literal { or }, escape them or use alternative delimiters (e.g., {$name} vs. {name}). The package uses {} by default.
Fix: Use {$literal} for literal braces or adjust delimiters via:
$xmlFaker->setDelimiters('{{', '}}');
Faker Locale Mismatch
Ensure Faker’s locale matches your expected output (e.g., en_US for US addresses). Set it explicitly:
$faker = Faker::create('en_US');
XML Validation
Generated XML may not validate against strict schemas. Test with SimpleXMLElement or DOMDocument:
$xml = simplexml_load_string($fakeXml);
if ($xml === false) {
throw new \RuntimeException("Invalid XML generated");
}
Performance with Large Data Avoid generating massive XML in memory. Stream or chunk data for large datasets:
foreach (range(1, 1000) as $i) {
$xmlFaker->fake('<item>{$loop->index}</item>'); // Uses Faker's loop context
}
Custom Faker Providers
Extend Faker’s providers for domain-specific data. Register them before initializing XmlFaker:
Faker::addProvider(new CustomFakerProvider($faker));
Debugging Placeholders
Use {$debug} to inspect unresolved placeholders:
$xmlFaker->fake('<data>{$debug}</data>');
Contextual Data Pass custom data to Faker for consistency:
$faker->seed(1234);
$xmlFaker->fake('<user><name>{$name}</name><age>{$numberBetween(20,40)}</age></user>');
Laravel Blade Integration Create a Blade directive for reusable fake XML:
Blade::directive('fakeXml', function ($expression) {
return "<?php echo app(\Prewk\XmlFaker\XmlFaker::class)->fake($expression); ?>";
});
Usage:
@fakeXml('<user>{$name}</user>')
Testing
Mock XmlFaker in tests for predictable outputs:
$this->partialMock(XmlFaker::class, function ($mock) {
$mock->shouldReceive('fake')->andReturn('<mocked></mocked>');
});
Configuration
Override default settings in config/xml_faker.php:
'delimiters' => ['{{', '}}'],
'default_locale' => 'en_GB',
How can I help you explore Laravel packages today?