Patterns essentiels pour PHP moderne
Les design patterns sont des solutions éprouvées aux problèmes récurrents de conception logicielle. Voici les plus utiles en PHP.
Repository Pattern
interface ProductRepositoryInterface
{
public function findById(int $id): ?Product;
public function findByCategory(string $category): array;
public function save(Product $product): void;
}
class DoctrineProductRepository implements ProductRepositoryInterface
{
public function __construct(
private EntityManagerInterface $em,
) {}
public function findById(int $id): ?Product
{
return $this->em->find(Product::class, $id);
}
public function save(Product $product): void
{
$this->em->persist($product);
$this->em->flush();
}
}
Strategy Pattern
interface PricingStrategy
{
public function calculate(float $basePrice): float;
}
class RegularPricing implements PricingStrategy
{
public function calculate(float $basePrice): float
{
return $basePrice;
}
}
class PremiumPricing implements PricingStrategy
{
public function calculate(float $basePrice): float
{
return $basePrice * 0.8; // 20% de réduction
}
}
Observer Pattern avec Symfony Events
#[AsEventListener(event: OrderCreatedEvent::class)]
class SendOrderConfirmation
{
public function __invoke(OrderCreatedEvent $event): void
{
$this->mailer->send(
new OrderConfirmationEmail($event->getOrder())
);
}
}
Builder Pattern
class QueryBuilder
{
private array $conditions = [];
private ?int $limit = null;
public function where(string $field, mixed $value): self
{
$this->conditions[$field] = $value;
return $this;
}
public function limit(int $limit): self
{
$this->limit = $limit;
return $this;
}
public function build(): Query
{
return new Query($this->conditions, $this->limit);
}
}
- Repository : abstraction de la couche de persistance
- Strategy : algorithmes interchangeables
- Observer : découplage par événements
- Builder : construction d'objets complexes