ardenexal / fhir-code-generation
FHIR code generation component for PHP FHIRTools
Installs: 1
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
pkg:composer/ardenexal/fhir-code-generation
Requires
- php: >=8.2
- ext-zip: *
- amphp/http-client: ^5.3.4
- composer/semver: ^3.4.4
- nette/php-generator: ^4.1
- symfony/console: ^6.4|^7.4
- symfony/filesystem: ^6.4|^7.4
- symfony/intl: ^6.4|^7.0
- symfony/string: ^6.4|^7.0
- symfony/validator: ^6.4|^7.0
Requires (Dev)
- giorgiosironi/eris: ^1.0
- phpunit/phpunit: ^12.5
README
PHP library for generating FHIR model classes from StructureDefinitions. Produces PHP classes, data types, primitives, and enums from FHIR Implementation Guide packages.
Features
- Generate PHP classes from FHIR StructureDefinitions
- Generate PHP enums from FHIR ValueSets
- Package management with FHIR registry integration
- Semantic version resolution and dependency handling
- Local package caching with integrity verification
- Offline mode for air-gapped environments
How It Works
The code generation pipeline:
- Package Loading — Downloads and caches FHIR IG packages (
.tgz) frompackages.fhir.org - Definition Parsing — Reads StructureDefinition and ValueSet JSON resources from the package
- Class Generation — Produces PHP classes using Nette PhpGenerator:
- Resources (Patient, Observation, etc.)
- Data Types (HumanName, Address, etc.)
- Primitives (FHIRString, FHIRInteger, etc.)
- Backbone Elements (nested within parent resource namespaces)
- Enum Generation — Produces PHP enums from required ValueSets (AdministrativeGender, etc.)
Usage
Generation is driven through the fhir:generate console command:
# Generate R4 models php bin/console fhir:generate --package=hl7.fhir.r4.core -vvv # Generate R4B models php bin/console fhir:generate --package=hl7.fhir.r4b.core -vvv # Generate multiple versions at once php bin/console fhir:generate --package=hl7.fhir.r4.core --package=hl7.fhir.r4b.core -vvv # Offline mode (cached packages only) php bin/console fhir:generate --package=hl7.fhir.r4.core --offline -vvv
The terminology package (hl7.terminology.r4) is automatically included as a dependency.
Composer Scripts
composer run generate-models-r4 # R4 only composer run generate-models-r4b # R4B only composer run generate-models-all # R4 + R4B + R5
Core Classes
FHIRModelGenerator
Generates PHP classes from individual StructureDefinitions:
use Ardenexal\FHIRTools\Component\CodeGeneration\Generator\FHIRModelGenerator; // Called internally by the generate command for each StructureDefinition $classType = $generator->generate($structureDefinition, $version, $builderContext);
FHIRValueSetGenerator
Generates PHP enums from ValueSet definitions:
use Ardenexal\FHIRTools\Component\CodeGeneration\Generator\FHIRValueSetGenerator; $enumType = $generator->generateEnum($valueSetDefinition, $version, $builderContext);
PackageLoader
Manages FHIR package downloads, caching, and extraction:
use Ardenexal\FHIRTools\Component\CodeGeneration\Package\PackageLoader; // Install a package (downloads if not cached) $metadata = $loader->installPackage('hl7.fhir.r4.core', '4.0.1'); // Load StructureDefinitions into the build context $definitions = $loader->loadPackageStructureDefinitions($metadata); // Check cache $isCached = $loader->isPackageCached('hl7.fhir.r4.core', '4.0.1');
BuilderContext
Holds state during generation — loaded definitions, generated classes, namespace registrations:
use Ardenexal\FHIRTools\Component\CodeGeneration\Context\BuilderContext; $context = new BuilderContext(); $context->addDefinition($url, $definition);
Error Handling
use Ardenexal\FHIRTools\Component\CodeGeneration\Exception\GenerationException; use Ardenexal\FHIRTools\Component\CodeGeneration\Exception\PackageException; try { $metadata = $loader->installPackage('hl7.fhir.r4.core'); } catch (PackageException $e) { // Package download, extraction, or integrity failures } catch (GenerationException $e) { // Code generation failures }
Non-fatal errors are collected via ErrorCollector and reported at the end of generation.
Requirements
- PHP: 8.3 or higher
License
This component is released under the MIT License. See the LICENSE file for details.