Korrektes Repository-Pattern-Design in PHP?

Der Repository-Muster in PHP ist ein Entwurfsmuster, das es ermöglicht, die Geschäftslogik einer Anwendung von der Speicherung und Abfrage von Daten zu trennen. Das Muster beinhaltet das Erstellen einer Repository-Klasse, die als Vermittler zwischen der Geschäftslogik und der Datenspeicherung agiert.

Hier sind einige wichtige Prinzipien, die beim Entwerfen eines Repository-Musters in PHP beachtet werden sollten:

  1. Die Repository-Klasse sollte sich nur mit der Datenspeicherung, wie z.B. einer Datenbank oder einer API, beschäftigen.

  2. Die Repository-Klasse sollte keine Geschäftslogik enthalten.

  3. Die Repository-Klasse sollte eine konsistente und einfach zu verwendende Schnittstelle für den Rest der Anwendung bereitstellen, um mit der Datenspeicherung zu interagieren.

  4. Die Repository-Klasse sollte leicht testbar sein, indem die Datenspeicherung durch einen Test-Double wie einen Mock oder Stub ausgetauscht werden kann.

  5. Die Repository-Klasse sollte von der verwendeten Datenspeichertechnologie entkoppelt sein, damit sie leicht durch eine andere ersetzt werden kann.

  6. Verwenden Sie Schnittstellen, um die erwarteten Methoden und Typen des Repository zu definieren.

  7. Verwenden Sie die Abhängigkeitsinjektion, um die Repository-Klasse an die Klassen weiterzuleiten, die sie benötigen.

Ein Beispiel für ein einfaches Repository-Muster in PHP wäre:

<?php

interface RepositoryInterface
{
  public function getById($id);
  public function getAll();
  public function save($data);
}

class Repository implements RepositoryInterface
{
  protected $db;
  public function __construct($db)
  {
    $this->db = $db;
  }
  public function getById($id)
  {
    // mock implementation to return data
    return ['id' => $id, 'name' => 'Product ' . $id, 'price' => 100.0];
  }
  public function getAll()
  {
    // mock implementation to return all data
    return [['id' => 1, 'name' => 'Product 1', 'price' => 100.0], ['id' => 2, 'name' => 'Product 2', 'price' => 200.0], ['id' => 3, 'name' => 'Product 3', 'price' => 300.0]];
  }
  public function save($data)
  {
    // mock implementation to save data
    echo "Saving data: " . print_r($data, true) . "\n";
  }
}

$repository = new Repository(null);

$productId = 1;
$product = $repository->getById($productId);

echo "Product Information: ";
echo "ID: " . $product['id'] . "\n";
echo "Name: " . $product['name'] . "\n";
echo "Price: " . $product['price'] . "\n";

$allProducts = $repository->getAll();
echo "All Products: \n";
foreach ($allProducts as $p) {
  echo "ID: " . $p['id'] . "\n";
  echo "Name: " . $p['name'] . "\n";
  echo "Price: " . $p['price'] . "\n";
}

$newProduct = ['name' => 'Super Product', 'price' => 99.99];
$repository->save($newProduct);
echo "New product saved successfully!\n";

?>

Dies ist nur ein Beispiel und Sie können Methoden hinzufügen oder entfernen, je nach Ihren Anforderungen.