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
Requires
- doctrine/common: ^3.5
- symfony/event-dispatcher: ^6 || ^7
- symfony/http-kernel: ^6 || ^7
- symfony/serializer: ^6 || ^7
Requires (Dev)
- behat/behat: ^3.14
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^10.0
- symfony/property-access: ^6 || ^7
- symfony/property-info: ^6 || ^7
README
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
- 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... }
- 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
- Behat Tests: Acceptance test documentation
- Coverage Reports: Detailed coverage analysis
๐ค Contributing
- Fork the repository
- Create a feature branch
- Run tests:
./bin/run-ci-tests.sh
- Ensure 100% coverage
- Submit a pull request
๐ License
This project is licensed under the MIT License.