DI - Service containter
userMapper.php
Code (php)
Elke instantie van userMapper kan toch maar één storage hebben? Wat mij wel logisch lijkt!
of pas ik het zo aan?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$container->set('user.mapper.temporaryStorage', function($c)
{
$class = $c->get('user.mapper.databaseStorage');
$class->setStorage($c->get('storage.session'));
return $class;
});
?>
$container->set('user.mapper.temporaryStorage', function($c)
{
$class = $c->get('user.mapper.databaseStorage');
$class->setStorage($c->get('storage.session'));
return $class;
});
?>
Maar goed, wat ik dus zou doen is in je UserMapper 2 storages laten meegeven. Eentje om tijdelijke (temporary) dingen in op te slaan, zoals een SessionStorage, en eentje om vaste dingen (db) in op te slaan, zoals een DbStorage.
Dus eigenlijk zou de usermapper / elke mapper een oneindig aantal storages moeten kunnen hebben? Als je wil opslaan in een db, in een xml en in een sessie. Je zou 3x een nieuwe usermapper kunnen maken maar dat is tegen de OOP regels? Dus eigenlijk een array met alle storages en dan per functie meegeven welke storage je gaat gebruiken? Een extra paramater bij bv. de find() functie?
Nee, de usermapper gebruikt 2 soorten storage. Hij moet een database storage instance (wat dit is, een xml/yml/csv/...-bestand, PDO database, ect. maakt niks uit) om gebruikers voor goed op te slaan en een tijdelijke storage instance (sessie, cookie, tijdelijk bestandje, ect.) om te onthouden welke gebruiker ingelogd is.
-----------------------------
Indien we 2 storages hebben een temp en een "vaste" dan moet ik eigenlijk 2 find() functies hebben? find() en findTemp()?
Code (php)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
class UserMapper
{
private $storage;
private $tempStorage;
public function __construct($storageValue,$storage)
{
// true = storage, false = temporary
if($storage === true)
{
$this->setStorage($storageValue);
}
else
{
$this->setTempStorage($storageValue);
}
}
protected function setTempStorage($storage)
{
$this->storage = $storage;
}
protected function getStorage()
{
return $this->storage;
}
protected function setTempStorage($storage)
{
$this->tempStorage = $storage;
}
protected function getTempStorage()
{
return $this->tempStorage;
}
/**
* populate array into a User object
*
* @author JasperDS <http://jasperdesmet.be>
* @param array $data
* @return User
*/
public function populate($data)
{
if(isset($data['name']))
{
$user = new User($data['name']);
}
else
{
$user = 'Not found';
}
if(isset($data['id']))
{
$user->setId($data['id']);
}
if(isset($data['email']))
{
$user->setEmail($data['email']);
}
if(isset($data['password']))
{
$user->setPassword($data['password']);
}
return $user;
}
/**
* Find a User in the storage
*
* @author Jasper De Smet <http://www.jasperdesmet.be>
* @version 1.0
*
* @param User $user
* @param array $criteria the requested criteria (not required)
*
* @return bool
*/
public function find(array $fields, $criteria = NULL)
{
$results = array();
$results = $this->getStorage()->find('users', $fields, $criteria);
$users = array();
foreach($results as $result)
{
$users[] = $this->populate($result);
}
return $users;
}
/**
* Find a User in the tempstorage
*
* @author Jasper De Smet <http://www.jasperdesmet.be>
* @version 1.0
*
* @param User $user
* @param array $criteria the requested criteria (not required)
*
* @return bool
*/
public function findTemp(array $fields, $criteria = NULL)
{
$results = array();
$results = $this->getTempStorage()->find('users', $fields, $criteria);
$users = array();
foreach($results as $result)
{
$users[] = $this->populate($result);
}
return $users;
}
....
?>
class UserMapper
{
private $storage;
private $tempStorage;
public function __construct($storageValue,$storage)
{
// true = storage, false = temporary
if($storage === true)
{
$this->setStorage($storageValue);
}
else
{
$this->setTempStorage($storageValue);
}
}
protected function setTempStorage($storage)
{
$this->storage = $storage;
}
protected function getStorage()
{
return $this->storage;
}
protected function setTempStorage($storage)
{
$this->tempStorage = $storage;
}
protected function getTempStorage()
{
return $this->tempStorage;
}
/**
* populate array into a User object
*
* @author JasperDS <http://jasperdesmet.be>
* @param array $data
* @return User
*/
public function populate($data)
{
if(isset($data['name']))
{
$user = new User($data['name']);
}
else
{
$user = 'Not found';
}
if(isset($data['id']))
{
$user->setId($data['id']);
}
if(isset($data['email']))
{
$user->setEmail($data['email']);
}
if(isset($data['password']))
{
$user->setPassword($data['password']);
}
return $user;
}
/**
* Find a User in the storage
*
* @author Jasper De Smet <http://www.jasperdesmet.be>
* @version 1.0
*
* @param User $user
* @param array $criteria the requested criteria (not required)
*
* @return bool
*/
public function find(array $fields, $criteria = NULL)
{
$results = array();
$results = $this->getStorage()->find('users', $fields, $criteria);
$users = array();
foreach($results as $result)
{
$users[] = $this->populate($result);
}
return $users;
}
/**
* Find a User in the tempstorage
*
* @author Jasper De Smet <http://www.jasperdesmet.be>
* @version 1.0
*
* @param User $user
* @param array $criteria the requested criteria (not required)
*
* @return bool
*/
public function findTemp(array $fields, $criteria = NULL)
{
$results = array();
$results = $this->getTempStorage()->find('users', $fields, $criteria);
$users = array();
foreach($results as $result)
{
$users[] = $this->populate($result);
}
return $users;
}
....
?>
Gewijzigd op 09/01/2013 22:04:36 door Jasper DS
Gewijzigd op 11/01/2013 10:59:19 door Jasper DS
De userMapper heeft als enige verantwoordelijkheid om een User-object naar een andere laag in je applicatie te 'verschuiven'. In je andere objecten moet je dus zelf niet bezig zijn met de vraag hoe de userMapper dit moet doen of waar hij bepaalde objecten moet vinden. Dat is nou juist de verantwoordelijkheid van de userMapper.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class UserMapper {
public function find(array $params) {
// de usermapper moet zelf bedenken waar hij dit object kan vinden
// hij kan bijvoorbeeld eerst in de tempStorage kijken en als daar
// niets te vinden is in de normale storage
}
public function save(User $user) {
// idem dito, laat de userMapper bedenken waar het object hoort te worden opgeslagen
}
}
?>
class UserMapper {
public function find(array $params) {
// de usermapper moet zelf bedenken waar hij dit object kan vinden
// hij kan bijvoorbeeld eerst in de tempStorage kijken en als daar
// niets te vinden is in de normale storage
}
public function save(User $user) {
// idem dito, laat de userMapper bedenken waar het object hoort te worden opgeslagen
}
}
?>
Quote:
Moest ik dan bijvoorbeeld een user willen ophalen uit de database en in een xml bestand willen steken gebruik ik twee usermappers?
Deze vraag vind ik een beetje vreem gesteld, kan je iets precieser uitleggen wat de bedoeling hiervan is? Het exporteren van een aantal objecten neem ik aan?
Dan zou je aan de userMapper een functie export kunnen toevoegen:
Code (php)
Nogmaals het helpt jezelf en ons ook als je iets duidelijker de specificaties kan noemen die je UserSysteem moet hebben. Het is makkelijker om een lijstje System Requirements om te zetten naar een object ontwerp dan dit stapje voor stapje te doen!
Lees ook het boek Head First Object-Oriented Analysis and Design (daar dwaalt een pdf-je van rond op het web)!
Succes!
Gewijzigd op 11/01/2013 19:00:12 door Appel Taart
Ik ben momenteel dit topic aan het bekijken. Dat gaat over de model in een MVC framework.
De model bestaat daar uit 3 delen: Domain Object (aanwezig), mapper (aanwezig), serviceLayer (min of meer aanwezig).
In deze implementatie is het domain object oke denk ik. De mapper ga ik deels anders moeten laten functioneren en de service-container ga ik anders moeten implementeren.
Elke model moet een serviceLayer hebben want die legt de connectie tussen de controllor het domain object en de mapper.
Lijkt dat jullie ook een goede methode?