2017-09-08 2 views
3

Exemple avec MySQL:Comment appelle-t-on un motif lorsqu'il combine une fabrique avec un modèle de référentiel pour créer ou mettre à jour/recharger des objets?

/* 
* Used to create a populated Staff instance 
*/ 
class StaffCreator 
{ 
    /** @var MySql */ 
    private $mySql; 

    function __construct(MySql $mySql) 
    { 
     $this->mySql = $mySql; 
    } 

    function createStaff(string $username): Staff 
    { 
     $staff = new Staff(); 
     $staff->setData($this->getData($username)); 
     return $staff; 
    } 

    function getData(string $username): array 
    { 
     return $this->mySql 
      ->query("SELECT .. WHERE username = ?")->param($username)->getResults(); 
    } 
} 

//calling: 
$staff = (new StaffCreator($mysql))->createStaff($username); 

Exemple avec Doctrine:

/** 
* Creates Ledger 
*/ 
class LedgerCreator 
{ 
    private $doctrine; 

    function __construct(EntityManager $doctrine) 
    { 
     $this->doctrine = $doctrine; 
    } 

    /** 
    * Create Domain entity called Ledger, 
    * populate it with items and metadata 
    * Return it 
    */ 
    function getLedger(int $ledgerId): Ledger 
    { 
     $query = $this->doctrine->createQuery(' 
      SELECT ... 
      FROM ... 
      WHERE ... 
     ')->setParameter('ledger_id', $ledgerId); 

     //create, init, populate, and return Ledger instance 
     $ledger = new Ledger($this->doctrine->find(LedgerEntity::class, $ledgerId)); 
     $ledger->setItems($query->getResult()); 
     return $ledger; 
    } 
} 

//to call: 
$ledger = new LedgerCreator($doctrine)->createLedger($id); 

Est-ce modèle une usine? Un référentiel? DataMapper? Un hybride? Autre chose?

+0

Euh ... FaPository? – waterloomatt

Répondre

0

C'est une version perverse du constructeur. Il crée une instance d'objet avec des propriétés données. Il est combiné avec le mappeur de données et le référentiel))

0

Ce type ressemble à Memento. A partir du PHP Design Patterns reference:

Dans le modèle Memento, un objet mémento va conserver l'état d'un autre objet.

De Wikipedia:

Le motif memento est mis en œuvre avec trois objets: l'expéditeur, un gardien et un souvenir. L'expéditeur est un objet qui a un état interne. Le gardien va faire quelque chose à l'origine, mais veut être capable d'annuler le changement. Le concierge demande d'abord à l'expéditeur un objet souvenir.

Dans cet exemple, la classe BookMark est le "Memento" et conserve l'état de la classe BookReader. La classe BookReader serait le "Originator" dans cet exemple, car il avait l'état d'origine. TestMemento.php contient l'objet BookMark, ainsi que le "Caretaker".

Par rapport à vos exemples:

  ----------- Example ----------- 
Participant | Mysql  | Doctrine 
============|==============|============== 
Originator | MySql  | EntityManager 
Caretaker | StaffCreator | LedgerCreator 
Memento  | Staff  | Ledger