databse in een class, hoe?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

27/02/2012 21:58:51
Quote Anchor link
Ola,

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class User
{

  public function getById($id) {
    $database = Registry::get('database');
    // gebruiker inladen
  }

  public function save() {
    $database = Registry::get('database');
    // gebruiker opslaan
  }

}

?>
 
PHP hulp

PHP hulp

29/03/2024 14:14:10
 
Tom Swinkels

Tom Swinkels

27/02/2012 22:45:03
Quote Anchor link
Een user klasse hoort niet te weten wat er opgeslagen word daar is een userMapper voor. Verder kun je PDO gebruiken en geef je die mee aan de constructor.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
    }

}


Wanneer je iets in de database op wil slaan maak je een nieuwe functie (methode) en kun je de database gebruiken bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
    public function ietsuitdedb()
    {
        $resultUser = $this->_db->prepare("SELECT user_name FROM user");

        $resultUser->execute(array());
        $listUser = $resultUser->fetch(PDO::FETCH_ASSOC);

        return $listUser['user_name']);
    }
 
Wouter J

Wouter J

27/02/2012 22:47:39
Quote Anchor link
@Tom, in plaats van PDO meegeven aan de constructor lijkt me de methode van Ozzie beter. Je hoeft dan niet de hele PDO klasse in te laden in een object.
Tevens heb je wel gelijk dat hier een DataMapper voor nodig is.
 
Tom Swinkels

Tom Swinkels

27/02/2012 23:02:44
Quote Anchor link
@Wouter J, zou jij PDO meegeven in de methode dan? Ik verder nog nooit met Registry gewerkt zal daar eens naar kijken.
 
Ozzie PHP

Ozzie PHP

27/02/2012 23:03:36
Quote Anchor link
Dank voor de reacties... alleen ik snap niet wat jullie bedoelen met een DataMapper / UserMapper... kan iemand dat wat beter uitleggen misschien?
 
Tom Swinkels

Tom Swinkels

27/02/2012 23:39:03
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

27/02/2012 23:40:49
Quote Anchor link
Kan je dan misschien een codevoorbeeld geven van een (hele simpele) user class en een data mapper zodat ik kan zien hoe het werkt?
 
Tom Swinkels

Tom Swinkels

28/02/2012 00:18:27
Quote Anchor link
Hoop dat dit voorbeeldje een beetje duidelijk word!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>
 
Ozzie PHP

Ozzie PHP

28/02/2012 06:33:52
Quote Anchor link
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?
 
Wouter J

Wouter J

28/02/2012 10:04:35
Quote Anchor link
Een datamapper is een klasse dat gegevens van een object opslaat in de database zonder dat de db of het object van elkaar weten.

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.
 
Ozzie PHP

Ozzie PHP

28/02/2012 10:14:04
Quote Anchor link
Thanks Wouter! Dat onlangs is alweer ruim een jaar geleden :)

Ik heb dit even gekopieerd uit de opmerking van Pim:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$user
= User::load($id) // Gaat statisch het netst
$user->save();
?>


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?
 
Wouter J

Wouter J

28/02/2012 10:49:28
Quote Anchor link
ActiveRecord is een klasse met methods waarmee je kan communiceren met de DB. Een User klasse extends deze ActiveRecord klasse, vandaar dat je -als je googled- niet heel veel positiefs hoort over dit pattern, de overerving is OO niet correct.

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
 
Ozzie PHP

Ozzie PHP

28/02/2012 11:09:09
Quote Anchor link
oke, thanks... ik kan weer ff vooruit ;)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.