Skip to main content

Symfony Validation Strategy

tip

This page is current and ready for use.

Overview

This guide outlines the recommended validation approach for Symfony 7 applications using Overblog GraphQL bundle with PostgreSQL database, focusing on a multi-layered validation strategy that ensures data integrity and maintainable code.

1. Primary Validation Layer: ValueObjects/DTOs

ValueObjects and DTOs should serve as your first line of defense for validation, particularly suited for:

  • Complex domain rules implementation
  • Business logic validation requirements
  • Input data transformation and validation

Best Practices

  • Encapsulate complex validation logic within ValueObjects
  • Use DTOs for structured data transfer between layers
  • Implement domain-specific validation rules at this level
  • Keep validation logic close to the business domain

2. Entity-Level Validation: Doctrine Attributes

Doctrine attributes provide a robust way to implement:

  • Entity-level validation rules
  • Integration with Symfony's native validation system
  • Validation for traditional REST endpoints

Implementation Tips

  • Use attributes to define validation constraints on entity properties
  • Leverage Symfony's validation component
  • Apply validation groups when needed
  • Consider this mandatory for non-GraphQL endpoints

3. GraphQL Schema Validation

Recommendation: Skip Overblog GraphQL YAML validation in favor of DTO validation because:

  • It creates redundancy with ValueObject/DTO validation
  • Makes schema files more complex and harder to maintain
  • Increases maintenance overhead

Migration Strategy

  • Move existing YAML validations to DTO classes
  • Keep GraphQL schema focused on type definitions
  • Utilize DTOs for input validation

4. Database-Level Constraints

Implement database constraints as your final validation layer:

  • Acts as the last line of defense
  • Ensures data integrity at the storage level
  • Critical for microservices architectures

Implementation Guidelines

  • Define appropriate CHECK constraints
  • Implement UNIQUE constraints where needed
  • Set up foreign key constraints
  • Consider adding triggers for complex validations

Architecture Considerations

For microservices architecture:

  • Database constraints become even more critical
  • Multiple services may access the same database
  • Ensure consistent validation across services
  • Consider implementing shared validation libraries

Code Example

// Example DTO with validation
use Symfony\Component\Validator\Constraints as Assert;

class UserDTO
{
#[Assert\NotBlank]
#[Assert\Email]
private string $email;

#[Assert\NotBlank]
#[Assert\Length(min: 8)]
private string $password;

// Getters and setters
}

// Example Entity with Doctrine constraints
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class User
{
#[ORM\Column(unique: true)]
#[Assert\NotBlank]
private string $email;

#[ORM\Column]
private string $password;

// Entity methods
}

Summary

  1. Use ValueObjects/DTOs for primary business rule validation
  2. Implement Doctrine attributes for entity-level validation
  3. Avoid redundant GraphQL YAML validation
  4. Ensure proper database constraints
  5. Consider the implications of your microservices architecture

This layered approach ensures robust validation while maintaining code maintainability and scalability.