Custom Post Processors

You can implement custom post processors to accomplish your tasks. Each post processor must extend the class PHPModelGenerator\SchemaProcessor\PostProcessor\PostProcessor. If you have implemented a post processor add the post processor to your ModelGenerator and the post processor will be executed for each class.

A custom post processor which adds a custom trait to the generated model (eg. a trait adding methods for an active record pattern implementation) may look like:

namespace MyApp\Model\Generator\PostProcessor;

use MyApp\Model\ActiveRecordTrait;
use PHPModelGenerator\SchemaProcessor\PostProcessor\PostProcessor;

class ActiveRecordPostProcessor extends PostProcessor
{
    public function process(Schema $schema, GeneratorConfiguration $generatorConfiguration): void
    {
        $schema->addTrait(ActiveRecordTrait::class);
    }
}

Hint

For examples how to implement a custom post processor have a look at the built in post processors located at src/SchemaProcessor/PostProcessor/

What can you do inside your custom post processor?

  • Add additional traits and interfaces to your models

  • Add additional methods and properties to your models

  • Add PHP attributes to the generated class or to individual properties (see PHP Attributes below)

  • Hook via SchemaHooks into the generated source code and add your snippets at defined places inside the model:

    • Implement the ConstructorBeforeValidationHookInterface to add code to the beginning of your constructor

    • Implement the ConstructorAfterValidationHookInterface to add code to the end of your constructor

    • Implement the GetterHookInterface to add code to your getter methods

    • Implement the SetterBeforeValidationHookInterface to add code to the beginning of your setter methods

    • Implement the SetterAfterValidationHookInterface to add code to the end of your setter methods

    • Implement the SerializationHookInterface to add code to the end of your serialization process

Warning

If a setter for a property is called with the same value which is already stored internally (consequently no update of the property is required), the setters will return directly and as a result of that the setter hooks will not be executed.

This behaviour also applies also to properties changed via the populate method added by the PopulatePostProcessor and the additionalProperties().set() method added by the AdditionalPropertiesAccessorPostProcessor

To execute code before/after the processing of the schemas override the methods preProcess and postProcess inside your custom post processor.

PHP Attributes

You can attach PHP 8.0 attributes to the generated class and to individual properties using PHPModelGenerator\Model\Attributes\PhpAttribute.

Class-level attribute (placed before the class keyword in the generated file):

use PHPModelGenerator\Model\Attributes\PhpAttribute;
use PHPModelGenerator\SchemaProcessor\PostProcessor\PostProcessor;

class ORM_EntityPostProcessor extends PostProcessor
{
    public function process(Schema $schema, GeneratorConfiguration $generatorConfiguration): void
    {
        // No arguments
        $schema->addAttribute(new PhpAttribute(\Doctrine\ORM\Mapping\Entity::class));

        // With positional arguments (pre-rendered PHP expression strings)
        $schema->addAttribute(new PhpAttribute(\Doctrine\ORM\Mapping\Table::class, ["'users'"]));

        // With named arguments
        $schema->addAttribute(new PhpAttribute(
            \Doctrine\ORM\Mapping\Table::class,
            ['name' => "'users'", 'schema' => "'public'"],
        ));
    }
}

Property-level attribute (placed before the property declaration in the generated file):

use PHPModelGenerator\Model\Attributes\PhpAttribute;
use PHPModelGenerator\SchemaProcessor\PostProcessor\PostProcessor;

class ORM_ColumnPostProcessor extends PostProcessor
{
    public function process(Schema $schema, GeneratorConfiguration $generatorConfiguration): void
    {
        foreach ($schema->getProperties() as $property) {
            $property->addAttribute(new PhpAttribute(
                \Doctrine\ORM\Mapping\Column::class,
                ['name' => "'" . $property->getName() . "'"],
            ));
        }
    }
}

The constructor of PhpAttribute accepts:

  • $fqcn — the fully-qualified class name of the attribute (e.g. 'Doctrine\\ORM\\Mapping\\Column')

  • $arguments — an optional array of pre-rendered PHP expression strings:

    • Integer keys → positional arguments (rendered as-is)

    • String keys → named arguments (rendered as key: value)

Hint

The library implements a set of attributes which can be configured via the attribute configuration on the GeneratorConfiguration