Transfer Object Assembler avec Doctrine 1

Posted on 31/05/2010 · Posted in Doctrine, Zend

doctrineLe pattern Transfert Object TO, Data Transfert Object DTO, ou encore Value Object VO permet d’échanger des données entre deux applications.

Wikipédia : Son but est de simplifier les transferts de données entre les sous-systèmes d’une application logiciel. Les objets de transfert de données sont souvent utilisés en conjonction des objets d’accès aux données.

Qui dit Transfert Object, veux aussi dire Transfert Object Assembler.

Conversion d’object

Le pattern Transfert Object Assembler permet de passer d’un DTO à un Objet d’accès au données, et inversement.
C’est le moyen le plus simple pour travailler avec le pattern Data Transert Object et un ORM.

Domain Object Model -> Data Transfert Object

Avec l’ORM Doctrine, le transfert d’un “Domain Object Model DOM” ou ici Doctrine_Record vers un DTO est très simple.
Il suffit de réaliser un parser qui analyse l’objet issu de Doctrine, et qui remplit les données du DTO.

Data Transfert Object -> Domain Object Model

Convertir un DTO vers un DOM peut s’avère plus complexe.
En effet, Doctrine utilise des collections d’objet qui lui sont propres, mais a aussi besoin de connaitre les clés primaires et leurs contenus pour pouvoir créer un objet. Car un objet issu de Doctrine_Record n’a pas les même propriétés quand il est existant en base de donnée, ou qu’il est en phase d’être sauvegardé.

Implémentation de Transfer Object Assembler

Une implémentation du pattern Transfert Object Assembler vient de voir le jour après moult et moult péripéties.

Cette implémentation permet donc le transférer de DTOs à partir de DOMs et inversement.
Associer au pattern Service Layer, cela peut s’avérer être très pratique.

Voici un exemple simple d’utilisation :

1
2
3
4
5
6
7
8
9
10
$oProgram = new ProgramDTO ();
$oProgram->title = "Dorothe";

$oVideoDTO = new VideoDTO ();
$oVideoDTO->idVideo = 30;
$oVideoDTO->program = $oProgram;

$oAssembler = $new Assembler ();
$oVideo = $oAssembler->createDomainObject ($oVideoDTO);
$oVideo->save ();

Nous avons ici créé une nouvelle entrée dans la table programs, et réalisé une liaison entre ce nouvel objet et la vidéo existante d’identifiant 30.
Le tout one-shot !

L’intérêt de cette implémentation, c’est d’être fonctionnel avec :

  • Les objets persistant
  • Les objets non-persistant
  • Les compositions d’objets sur N niveau

Utilisation avec le pattern Service Layer

Nous allons voir l’exemple le plus simple, soit l’implémentation des méthodes CRUD pour un objet générique.
L’utilisation du nommage des classes provient de l’utilisation de Zend Framework.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */
public function create (Model_DTO_Video $poVideoDTO)
{
    $oModelVideo        = null;
    $oAssembler     = new Model_Utils_Assembler ();
    $oModelVideo        = $oAssembler->createDomainObject($poVideoDTO, true);
    $oModelVideo->save ();
    $poVideoDTO->idShow  = $oModelVideo->idShow;
    return $poVideoDTO;
}

/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */
public function read (Model_DTO_Video $poVideoDTO)
{
    $query  = Doctrine_Query::create ()
        ->select ("video.*")
        ->from ("Model_Video video")
        ->where ("video.id_show = ?", $piIdVideo);
    $oModelVideo    = $query->fetchOne ();
    $oAssembler = new Model_Utils_Assembler ();
    return $oAssembler->createTransfertObject ($oModelVideo);
}

/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */
public function update (Model_DTO_Video $poVideoDTO)
{
    $oModelVideo    = null;
    $oAssembler = new Model_Utils_Assembler ();
    $oModelVideo    = $oAssembler->createDomainObject($poVideoDTO, true);
    $oModelVideo->save ();
       
    return $poVideoDTO;
}

/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */
public function delete (Model_DTO_Video $poVideoDTO)
{
    $oModelVideo    = null;
    $oAssembler = new Model_Utils_Assembler ();
    $oModelVideo    = $oAssembler->createDomainObject($poVideoDTO, false);
    $oModelVideo->delete ();
       
    return $poVideoDTO;
}

Téléchargement

Contenu de l’archive :

  • Implémentation du pattern Transfer Object Assembler
  • Interface du pattern Transfer Object Assembler
  • Classe de définition d’un DTO

Pour faire fonctionner l’assembler. Vous devez définir une classe qui hérite de Assembler, et ainsi surchargez la propriété $_relationships avec vos liaisons entre DTO et DOM.

Dernière mise à jour : 20 Septembre 2010
Transfert_Object_Assembler_Doctrine_1.2.zip – 6 Ko.