gryfoss/mvc-vm-normalizer

Symfony MVC View Model Normalizer - provides DefaultViewModel attribute and normalizer for intermediate layer between data models and view serialization

v1.0.2 2025-08-19 00:56 UTC

This package is auto-updated.

Last update: 2025-08-19 00:59:32 UTC


README

Tests Coverage PHP Tests

This adds the DefaultViewModel attribute into the system and a Symfony Serializer normalizer that automatically transforms entities into their designated ViewModels during serialization.

โœจ Features

  • Attribute-based Configuration: Use #[DefaultViewModel] to specify ViewModels
  • SerializedName Support: Full support for #[SerializedName('alias')] attributes
  • Nested Object Handling: Automatic handling of nested ViewModels
  • Collection Support: Transform arrays/collections of objects
  • 100% Test Coverage: Comprehensive PHPUnit + Behat test coverage
  • CI/CD Ready: Complete GitHub Actions workflows

๐Ÿš€ Quick Start

Installation

composer require gryfoss/mvc-vm-normalizer

Configuration

Configure the normalizer in your services.yaml:

  GryfOSS\Mvc\Normalizer\DefaultViewModelNormalizer:
    tags:
      - { name: serializer.normalizer, priority: 100 }

Basic Usage

  1. Add the attribute to your entities:
#[DefaultViewModel(viewModelClass: UserViewModel::class)]
class User implements NormalizableInterface
{
    public function __construct(
        private string $firstName,
        private string $lastName,
        private int $age
    ) {}

    // getters...
}
  1. Create your ViewModel:
class UserViewModel implements ViewModelInterface
{
    public function __construct(private User $user) {}

    #[SerializedName('n')]
    public function getName(): string
    {
        return $this->user->getFirstName() . ' ' . $this->user->getLastName();
    }

    #[SerializedName('a')]
    public function getAge(): int
    {
        return $this->user->getAge();
    }
}

Result:

{
  "n": "John Doe",
  "a": 30
}

๐Ÿงช Testing

Run All Tests

./bin/run-ci-tests.sh

Individual Test Suites

# PHPUnit tests with coverage
XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text

# Behat acceptance tests
./vendor/bin/behat

# Coverage verification
php bin/check-coverage.php

๐Ÿ“š Documentation

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Run tests: ./bin/run-ci-tests.sh
  4. Ensure 100% coverage
  5. Submit a pull request

๐Ÿ“„ License

This project is licensed under the MIT License.