Programming Languages PHP Subjective
Sep 23, 2025

Explain advanced PHP design patterns: Repository, Specification, and CQRS patterns. Provide implementation examples and discuss when to use each.

Detailed Explanation

Advanced PHP Design Patterns:

1. Repository Pattern:
Encapsulates data access logic and provides a uniform interface:

interface UserRepositoryInterface {
    public function find(int $id): ?User;
    public function save(User $user): void;
    public function findByEmail(string $email): ?User;
}

class DatabaseUserRepository implements UserRepositoryInterface {
    public function find(int $id): ?User {
        // Database query logic
        return $this->db->query("SELECT * FROM users WHERE id = ?", [$id]);
    }
    
    public function save(User $user): void {
        // Save logic
    }
}

2. Specification Pattern:
Encapsulates business rules and query logic:

interface SpecificationInterface {
    public function isSatisfiedBy($candidate): bool;
    public function toSql(): string;
}

class ActiveUserSpecification implements SpecificationInterface {
    public function isSatisfiedBy($user): bool {
        return $user->isActive() && $user->getLastLogin() > new DateTime("-30 days");
    }
    
    public function toSql(): string {
        return "status = 'active' AND last_login > DATE_SUB(NOW(), INTERVAL 30 DAY)";
    }
}

3. CQRS (Command Query Responsibility Segregation):
Separates read and write operations:

// Command side
class CreateUserCommand {
    public function __construct(
        public readonly string $email,
        public readonly string $name
    ) {}
}

class CreateUserHandler {
    public function handle(CreateUserCommand $command): void {
        $user = new User($command->email, $command->name);
        $this->userRepository->save($user);
    }
}

// Query side
class UserQuery {
    public function getUserById(int $id): UserReadModel {
        return $this->readModelRepository->find($id);
    }
}

When to Use:

  • Repository: Complex data access, testing, multiple data sources
  • Specification: Complex business rules, dynamic queries, reusable conditions
  • CQRS: High-performance applications, different read/write requirements, event sourcing
Discussion (0)

No comments yet. Be the first to share your thoughts!

Share Your Thoughts
Feedback