Gestione dell'inserimento nel database con pattern Repository

2

Ho una domanda di progettazione per lavorare con i database in PHP orientato agli oggetti.

Ho una tabella nel mio database chiamata products . Quindi ho 2 classi per questa tabella nel mio progetto PHP. ProductsRepository.php e Product.php .

ProductsRepository.php attualmente assomiglia a questo

class ProductsRepository
{

    private $db;

    public function __construct(DB $db)
    {
        $this->db = $db;
    }

    public function getById($id)
    {
        $data = $this->db->GetProductByID($id);

        $product = new Product(
            $data['id'],
            $data['category'],
            $data['title'],
            $data['description'],
        );

        return $product;
    }

    public function getAll()
    {
        $products = array();
        $data = $this->db->GetAllProducts();
        foreach ($data as $productData){
            $product = new Product(
                $productData['id'],
                $productData['category'],
                $productData['title'],
                $productData['description'],
            );
            $products[] = $product;
        }

        return $products;
    }
}

La mia domanda è come dovrei creare un metodo "createProduct". Innanzitutto, quale classe dovrebbe essere? Voglio che il metodo restituisca un'istanza del nuovo prodotto. Il problema principale che ho con questo è come dovrei gestire il id del nuovo prodotto poiché verrà dato il prossimo id disponibile dal database.

Alcune opzioni a cui ho pensato:

Hai createProduct in ProductsRepository e lascialo prendere un prodotto con id impostato su -1 come argomento

public function createProduct(Product $product)
{
    $product['id'] = $this->db->insertANewProduct($product); //returns the id
}

Hai createProduct in Product

Questo dovrebbe essere il costruttore per la classe Product ?

public function createProduct($db, $data)
{
    $this->$data = $data; //includes all info of the new product except the id
    $this->$data['id'] = $db->insertANewProduct($data); //returns the id
}
    
posta Oskar Persson 16.07.2015 - 23:02
fonte

1 risposta

2
$this->$data['id'] = $db->insertANewProduct($data);

Penso che sia una cattiva pratica, perché rompe il principio di responsabilità singola, la classe di prodotto sa che è stata mantenuta. Stai perdendo quello che vinci con il modello di repository. Se vuoi farlo un'altra opzione (meno OO) è Record attivo .

Vorrei scegliere l'opzione 1

    public function createProduct(Product $product){
       $product['id'] = $this->db->insertANewProduct($product);
       return $product;
    }

Lavoro davvero in Java e utilizzo JPA per la persistenza delle mie entità, in questo caso che hai un ID generato automaticamente l'implementazione JPA (cioè Hibernate) popolerà l'ID oggetto per te. Hai preso in considerazione l'uso di un ORM?

    
risposta data 17.07.2015 - 01:09
fonte