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