+<?php
+namespace Custom\Model;
+
+use Zend\Db\Adapter\Adapter;
+use Zend\Db\ResultSet\ResultSet;
+use Zend\Db\TableGateway\AbstractTableGateway;
+
+abstract class Manager extends AbstractTableGateway
+{
+
+ protected $entity;
+
+ public function __construct(
+ Adapter $adapter,
+ Entity $entity
+ ) {
+ // Composition avec l'adaptateur
+ $this->adapter = $adapter;
+
+ // Composition avec l'entité
+ $this->entity = $entity;
+
+ // Utilisation du patron de conception Prototype
+ // pour la création des objets ResultSet
+ $this->resultSetPrototype = new ResultSet();
+ $this->resultSetPrototype->setArrayObjectPrototype(
+ $entity
+ );
+
+ // Initialisation du gestionnaire
+ $this->initialize();
+ }
+
+ public function all()
+ {
+ return $this->select();
+ }
+
+ public function one($primary_array=array())
+ {
+ if (!count($primary_array)) {
+ $row = null;
+ } else {
+ $valid = true;
+ foreach($primary_array as $p) {
+ if ($p === null) {
+ $row = null;
+ $valid = false;
+ break;
+ }
+ }
+ if ($valid) {
+ $row = $this->select($primary_array)->current();
+ }
+ }
+ if (!$row) {
+ $keys = array();
+ foreach($primary_array as $k => $v) {
+ $keys[] = "{$k}: {$v}";
+ }
+ $keys = implode(', ', $keys);
+ throw new \Exception("cannot get row {{$keys}} in table 'galerie'");
+ }
+ return $row;
+ }
+
+ public function any($primary_array)
+ {
+ if (!count($primary_array)) {
+ $row = null;
+ } else {
+ $valid = true;
+ foreach($primary_array as $p) {
+ if ($p === null) {
+ $row = null;
+ $valid = false;
+ break;
+ }
+ }
+ if ($valid) {
+ $row = $this->select($primary_array)->current();
+ }
+ }
+ return $row;
+ }
+
+ protected abstract function is_new(Entity $entity);
+ protected abstract function extract_primary(Entity $entity);
+
+ public function save(Entity $entity)
+ {
+ if ($this->is_new()) {
+ $this->insert(
+ $entity->toUpdatableArray()
+ );
+ } elseif ($this->getGalerie(extract_primary($entity))) {
+ $this->update(
+ $entity->toUpdatableArray(),
+ $entity->toPrimaryArray()
+ );
+ } else {
+ $keys = array();
+ foreach($primary_array as $k => $v) {
+ $keys[] = "{$k}: {$v}";
+ }
+ $keys = implode(', ', $keys);
+ throw new \Exception("cannot update row {{$keys}} in table 'galerie'");
+ }
+ }
+
+ // La fonction delete du père suffit à notre besoin.
+
+}