databse in een class, hoe?
Een vraagje... als je in een class een database nodig hebt, wat is dan een goede en simpele manier? Ik zoek dus niet allerlei ingewikkelde constructies, maar gewoon iets simpels. Is het een idee om de database gewoon uit de Registry te halen als je 'm nodig hebt? Stel dat je een user class hebt dat je dan zoiets krijgt als dit?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try
{
$db = new PDO('mysql:host=' . $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
}
catch(PDOException $error)
{
echo 'ERROR: A database error occurred. Please contact the administrator..';
exit();
}
class UserMapper
{
private $_db;
public function __construct(PDO $db)
{
$this->_db = $db;
}
}
{
$db = new PDO('mysql:host=' . $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
}
catch(PDOException $error)
{
echo 'ERROR: A database error occurred. Please contact the administrator..';
exit();
}
class UserMapper
{
private $_db;
public function __construct(PDO $db)
{
$this->_db = $db;
}
}
Wanneer je iets in de database op wil slaan maak je een nieuwe functie (methode) en kun je de database gebruiken bijvoorbeeld:
Tevens heb je wel gelijk dat hier een DataMapper voor nodig is.
@Wouter J, zou jij PDO meegeven in de methode dan? Ik verder nog nooit met Registry gewerkt zal daar eens naar kijken.
Dank voor de reacties... alleen ik snap niet wat jullie bedoelen met een DataMapper / UserMapper... kan iemand dat wat beter uitleggen misschien?
Het wil niks anders zeggen dan MAPPER wat doet een mapper? Een mapper slaat bijvoorbeeld de data op. Stel je heb een gebruikers naam deze hoort dan in de user klasse thuis. Maar wil je die naam opslaan in de database dan hoort de user klasse dat niet te doen. Dat word gedaan door de mapper de mapper haal de naam op uit de user klasse en kan in de mapper vanalles mee doen.
Kan je dan misschien een codevoorbeeld geven van een (hele simpele) user class en een data mapper zodat ik kan zien hoe het werkt?
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
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
<?php
class User
{
public $name;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $name;
}
}
class UserMapper
{
private $_db;
public function __construct(PDO $db)
{
$this->_db = $db;
}
public function opslaan(User $user)
{
$resultUser = $this->_db->prepare("INSERT INTO
user
SET
user_name = ?
WHERE
user_id = ?
");
$resultUser->execute(array($user->getName(), 1));
$listUser = $resultUser->fetch(PDO::FETCH_ASSOC);
if($listUser)
{
return $listUser['user_name'];
}
}
}
$user = new User();
$user->setName = 'DIT IS EEN NAAM';
$userMapper = new UserMapper($db);
$userMapper->opslaan($user);
?>
class User
{
public $name;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $name;
}
}
class UserMapper
{
private $_db;
public function __construct(PDO $db)
{
$this->_db = $db;
}
public function opslaan(User $user)
{
$resultUser = $this->_db->prepare("INSERT INTO
user
SET
user_name = ?
WHERE
user_id = ?
");
$resultUser->execute(array($user->getName(), 1));
$listUser = $resultUser->fetch(PDO::FETCH_ASSOC);
if($listUser)
{
return $listUser['user_name'];
}
}
}
$user = new User();
$user->setName = 'DIT IS EEN NAAM';
$userMapper = new UserMapper($db);
$userMapper->opslaan($user);
?>
Dit begrijp ik al beter. Maar dat zou inhouden dat je voor iedere class waarin je een database nodig hebt dus een extra class moet maken waarmee je gegevens kunt opslaan? Op de een of andere manier krijg ik het gevoel dat dat een hoop dubbel werk is... Bestaan er ook manieren om zo'n UserMapper overkoepelend te maken voor meerdere klassen?
Nog een voorbeeldje van onze eigen Pim: http://www.phphulp.nl/php/forum/topic/oop-in-combinatie-met-database/81754/1/#580025
Je kan het ook met ActiveRecord doen. En onlangs heb je al gezegd dat je dat natuurlijker vind dan Datamappers.
Het ruby on rails framework werkt ook met active record, maar ook bij active record moet je voor elk object een eigen DBobject schrijven. Dat hoort gewoon bij OO, een klasse kan zichzelf niet ophalen, dat moet een andere klasse doen. Anders krijgt 1 klasse veel te veel macht.
Ik heb dit even gekopieerd uit de opmerking van Pim:
Maar waar komt die save() nu vandaan? Die staat wel gewoon in de User class dan? En haal je daar dan ook je database connectie op? Of begrijp ik het verkeerd nu?
Weer een voorbeeldje van Pim over ActiveRecord: http://www.phphulp.nl/php/forum/topic/applicatie-naamgeving/81370/3/#578116 (hierbij heeft hij de ActiveRecord klasse Model genoemd, maar bij nader navragen van Ozzie zegt hij dat hij deze klasse ActiveRecord o.i.d. zal noemen)
Gewijzigd op 28/02/2012 10:50:26 door Wouter J
oke, thanks... ik kan weer ff vooruit ;)