Pimcore Developer Tool
Deploy Pimcore content like code.
Convert Pimcore Documents, Assets and Data Objects into versioned Doctrine migrations for reproducible deployments.
4 week free trial. For business customers only. Price plus statutory VAT. Install directly via GitHub / Packagist.
bin/console content:migration:createDocumentBuilder::create('/news/article')
->setTitle('Example Article')
->setPublished(true)
->save();Without migrations
Content sync is manual and error-prone.
SQL dumps overwrite data. IDs differ between local, staging, and production. There is no diff and no PR review for content.
SQL dump conflicts
mysqldump exports full tables. Importing overwrites existing records and auto-increment values.
ID mismatch
document_id=42 in dev points to a different document in staging. Relations break silently.
Prod-to-dev direction
Editors change production directly. Those changes are never committed and get lost on next deploy.
No Git history
Content lives in the database only. git log shows nothing. git bisect cannot find regressions.
How it works
bin/console generates PHP migrations.
Select Documents, Assets, or Data Objects in Pimcore. Run the console command. Get a PHP migration class that uses a fluent builder API.
- Generates AbstractMigration subclasses in src/Migrations/
- Builder API: DocumentBuilder::create('/path')->setTitle('...')->save()
- Handles relations via path or reference, not hardcoded IDs
- Runs with bin/console doctrine:migrations:migrate
- Compatible with Pimcore 11.x
- Output is readable PHP, not serialized data
// Generated by Content Migration Bundle
public function up(Schema $schema): void
{
DocumentBuilder::create('/news/article')
->setTitle('Example Article')
->setPublished(true)
->save();
}Demo
Generate content migrations from Pimcore with a console command.
Select content in Pimcore, run the generator command, and commit the resulting PHP migration.
$bin/console content:migration:create [TYPE] [ID] [--namespace=...] [--with-children] [--inline-wysiwyg]Video: Installation, configuration, and usage
Watch on YouTubeThe video is hosted by YouTube. Clicking loads the player and may transfer personal data to Google/YouTube.
Documents
$bin/console content:migration:create document 142
# Create page /de/News
$builder = PageBuilder::findOrCreate('/de/News');
$builder->setController('App\Controller\NewsController::listingAction');
$builder->setProperty('footer', 'document', $documentDeSharedIncludesFooter, true, true);
$builder->setProperty('language', 'text', 'de', true, true);
$builder->setProperty('newsletter_confirm_mail', 'document', $documentDeMailsNewsletterConfirm, true, true);
$builder->setEditable(EditableBuilder::createInput('headline', 'Neuigkeiten aus der Oldie-WElt'));
$builder->setType('page');
$builder->setPublished(true);
$builder->save();Assets
$bin/console content:migration:create asset 68
# Create image /Car Images/ac cars/automotive-car-classic-149813.jpg
$builder = ImageBuilder::findOrCreate('/Car Images/ac cars/automotive-car-classic-149813.jpg', __DIR__ . '/files/asset/Car Images/ac cars/automotive-car-classic-149813.jpg');
$builder->setType('image');
$builder->setMimeType('image/jpeg');
$builder->setCustomSetting('imageWidth', 1280);
$builder->setCustomSetting('imageHeight', 720);
$builder->addMetadata('authorLink', 'input', 'https://www.pexels.com/@flickr', '');
$builder->addMetadata('license', 'input', 'CC0', '');
$builder->save();Data Objects
$bin/console content:migration:create object 372
# Create object /Product Data/Accessories/lights/head lights/ac cars-cobra 427-head lights
$builder = ConcreteBuilder::findOrCreate('/Product Data/Accessories/lights/head lights/ac cars-cobra 427-head lights', \App\Model\Product\AccessoryPart::class);
$builder->setPublished(true);
$builder->set('manufacturer', $objectProductDataManufacturerACCars);
$builder->set('series', $objectProductDataCarsAcCarsCobra427);
$builder->set('mainCategory', $objectProductDataCategoriesProductsSparePartsLightsHeadLamps);
$builder->set('erpNumber', '2176611183');
$builder->set('categoryCode', '394');
$builder->set('owner', 'PI');
$builder->save();Result
Content in version control.
Idempotent migrations
Same migration runs on local, staging, prod. No environment-specific patches.
PR review for content
Content changes appear in git diff. Review them before merge.
CI/CD integration
doctrine:migrations:migrate in your deployment pipeline. Content deploys with code.
Path-based references
Relations use /news/article not id=42. Works across databases with different auto-increment states.
No sync debugging
Stop comparing databases manually. Migration either runs or fails with a stack trace.
960 € / year
Roughly 80 € per month. One deployment debugging session costs more than that. Agency license covers unlimited projects and developers.
Pricing
Pimcore Content Migration Bundle
One plan for agencies building and maintaining Pimcore projects.
Agency License
plus statutory VAT
960 € per year = about 80 € per month
≈ 1–2 developer hours
- Unlimited projects
- Unlimited developers
- No domain limits
- No license key
- 4 week free trial
- Updates included
For business customers only.
FAQ