Skip to content

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

License

Notifications You must be signed in to change notification settings

GryfOSS/mvc-vm-normalizer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MVC View Model Normalizer

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.

About

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

Resources

License

Stars

Watchers

Forks

Packages

No packages published