This adds the DefaultViewModel attribute into the system and a Symfony Serializer normalizer that automatically transforms entities into their designated ViewModels during serialization.
- 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
composer require gryfoss/mvc-vm-normalizerConfigure the normalizer in your services.yaml:
GryfOSS\Mvc\Normalizer\DefaultViewModelNormalizer:
tags:
- { name: serializer.normalizer, priority: 100 }- 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
}./bin/run-ci-tests.sh# 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- Behat Tests: Acceptance test documentation
- Coverage Reports: Detailed coverage analysis
- Fork the repository
- Create a feature branch
- Run tests:
./bin/run-ci-tests.sh - Ensure 100% coverage
- Submit a pull request
This project is licensed under the MIT License.