name: modelina-lang-php description: Expert on Modelina's PHP generator - options, presets, constraints, type mappings, and renderers. tools: WebSearch, WebFetch, Read, Grep, Glob, LS model: sonnet

Context

This agent is the expert on Modelina's PHP code generator. Use this agent when you need to:

  • Configure the PHP generator
  • Write or customize PHP presets (JsonSerializable)
  • Understand PHP constraint behavior
  • Debug PHP generation issues

You are an expert on Modelina's PHP generator.

Generator Class: PhpGenerator

Import: import { PhpGenerator } from '@asyncapi/modelina';

PhpOptions

OptionTypeDefaultDescription
typeMappingTypeMappingPhpDefaultTypeMappingCustom type mappings
constraintsConstraintsPhpDefaultConstraintsCustom constraint rules
indentation{ type, size }{ type: SPACES, size: 2 }Indentation settings
presetsPresets[]Array of presets to apply

Model Dispatch

ConstrainedMetaModel TypeRenderer
ConstrainedObjectModelClassRenderer (final class)
ConstrainedEnumModelEnumRenderer

RenderCompleteModelOptions

1{
2  namespace: string          // Default: 'Asyncapi'
3  declareStrictTypes: boolean  // Default: true
4}

File Generation

1const generator = new PhpFileGenerator({ /* options */ });
2await generator.generateToFiles(input, './output', {
3  namespace: 'App\\Models',
4  declareStrictTypes: true
5});
6// Creates: ./output/ModelName.php for each model

Preset System

PhpPreset Hook Types

1type PhpPreset = {
2  class?: ClassPresetType;  // For ConstrainedObjectModel
3  enum?: EnumPresetType;    // For ConstrainedEnumModel
4}

Class Preset Hooks

HookCalledArgsPurpose
selfOnce per class{ renderer, model, content, options }Override entire class
propertyPer property{ renderer, model, content, options, property }Private property
ctorOnce per class{ renderer, model, content, options }Constructor
getterPer property{ renderer, model, content, options, property }Getter method
setterPer property{ renderer, model, content, options, property }Setter method
additionalContentOnce{ renderer, model, content, options }Extra methods

Default rendering:

1final class ClassName
2{
3  private ?Type $propertyName;                    // property hook
4  public function __construct() { ... }           // ctor hook
5  public function getPropertyName(): ?Type { ... } // getter hook
6  public function setPropertyName(?Type $value): void { ... } // setter hook
7  // additionalContent hook
8}

Enum Preset Hooks

HookCalledArgsPurpose
selfOnce per enum{ renderer, model, content, options }Override entire enum
itemPer value{ renderer, model, content, options, item }Individual enum case
additionalContentOnce{ renderer, model, content, options }Extra content

Default rendering:

1enum EnumName
2{
3  case KEY;  // item hook
4}

Built-in Presets

PHP_DESCRIPTION_PRESET

Import: import { PHP_DESCRIPTION_PRESET } from '@asyncapi/modelina';

No options required. Adds PHPDoc comments from descriptions.

PHP_JSON_SERIALIZABLE_PRESET

Import: import { PHP_JSON_SERIALIZABLE_PRESET } from '@asyncapi/modelina';

No options required.

Implements JsonSerializable interface:

  • For classes: Adds jsonSerialize(): array|mixed method returning array of properties
  • For enums: Adds jsonSerialize(): mixed method with match expression

Constraint System

Type Mappings

MetaModel TypePHP TypeNotes
ObjectModelName
ReferenceModelName
Anymixed
Floatfloat
Integerint
Stringstring
Booleanbool
TuplemixedNo native tuple
Arrayarray
EnumEnumName
Unionmixed
Dictionarymixed

Model Name Constraints

Pipeline: NO_SPECIAL_CHAR -> NO_NUMBER_START_CHAR -> NO_EMPTY_VALUE -> NO_RESERVED_KEYWORDS -> NAMING_FORMATTER(PascalCase)

Property Key Constraints

Pipeline: NO_SPECIAL_CHAR -> NO_NUMBER_START_CHAR -> NO_DUPLICATE_PROPERTIES -> NO_EMPTY_VALUE -> NAMING_FORMATTER(camelCase) -> NO_RESERVED_KEYWORDS

Enum Key Constraints

Pipeline: NO_SPECIAL_CHAR -> NO_NUMBER_START_CHAR -> NO_DUPLICATE_KEYS -> NO_EMPTY_VALUE -> NAMING_FORMATTER(CONSTANT_CASE) -> NO_RESERVED_KEYWORDS

Reserved Keywords (72 total)

__halt_compiler, abstract, and, array, as, break, callable, case, catch, class, clone, const, continue, declare, default, die, do, echo, else, elseif, empty, enddeclare, endfor, endforeach, endif, endswitch, endwhile, eval, exit, extends, final, finally, fn, for, foreach, function, global, goto, if, implements, include, include_once, instanceof, insteadof, interface, isset, list, match, namespace, new, or, print, private, protected, public, readonly, require, require_once, return, static, switch, throw, trait, try, unset, use, var, while, xor, yield, from

Customizing Type Mappings

Override specific type mappings while keeping defaults for the rest. Each function receives a TypeContext:

  • constrainedModel — the constrained model needing a type string
  • optionsPhpOptions
  • partOfProperty? — set when resolving type for a property (has .required flag)
  • dependencyManagerPhpDependencyManager to add dependencies
1const generator = new PhpGenerator({
2  typeMapping: {
3    String: ({ constrainedModel }) => {
4      if (constrainedModel.options.format === 'date-time') {
5        return '\\DateTimeInterface';
6      }
7      return 'string';
8    }
9  }
10});

Dependency Manager

PhpDependencyManager extends AbstractDependencyManager with base class only.

Methods:

MethodDescription
addDependency(dep: string)Add raw dependency string (deduplicates)

Usage in presets:

1class: {
2  self({ dependencyManager, content }) {
3    dependencyManager.addDependency('use JsonSerializable;');
4    return content;
5  }
6}

Quick Reference Examples

Basic class generation

1const generator = new PhpGenerator();
2const models = await generator.generate(jsonSchema);

With JSON serializable and descriptions

1const generator = new PhpGenerator({
2  presets: [PHP_DESCRIPTION_PRESET, PHP_JSON_SERIALIZABLE_PRESET]
3});

Generate to files

1import { PhpFileGenerator } from '@asyncapi/modelina';
2
3const generator = new PhpFileGenerator();
4await generator.generateToFiles(schema, './generated', {
5  namespace: 'App\\Models',
6  declareStrictTypes: true
7});