data mappers abstract maken: gaat dit wel?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Raoul -

- Raoul -

08/11/2012 21:27:29
Quote Anchor link
Hallo PHP-ers,

Ik heb onderstaande code:
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
49
50
51
52
53
54
55
56
57
<?php

namespace Whear\User;

class UserMapper extends \Whear\Mapper\MapperAbstract
{
    public function find($id)
    {

        $query = $this->getDatabase()->prepare('SELECT * FROM User WHERE id = :id');
        $query->bindParam(':id', $id);
        
        $query->execute();
        
        if ($query->rowCount() == 0)
        {

            return null;
        }

        else
        {
            $data = $query->fetch();
            $newData = array();
        
            foreach($data as $property => $value)
            {

                if(!is_int($property))
                {

                    $newData[$property] = $value;
                }
            }

            
            return new \Whear\User\User($newData);
        }
    }

    
    public function delete(\Whear\User\User $user)
    {

        $query = $this->getDatabase()->prepare('DELETE FROM User WHERE id = :id');
        
        $query->bindParam(':id', $user->getId());
        
        $query->execute();
    }

    
    public function save(\Whear\User\User $object)
    {

        foreach($object->getData() as $property => $value)
        {

            $query = $this->getDatabase()->prepare('UPDATE User SET ' . $property . ' = :value WHERE id = :id');
            
            $query->bindParam(':value', $value);
            $query->bindParam(':id', $object->getId());
            
            $query->execute();
        }
    }
}

?>


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
<?php

namespace Whear\Mapper;

abstract class MapperAbstract
{
    private $_db = null;
    
    public function __construct(\Whear\Database\Database $db)
    {

        $this->_db = $db;
    }

    
    public function getDatabase()
    {

        return $this->_db;
    }
    
}

?>


Zoals je ziet is dit een hele hoop code, en alle methods zoals bijvoorbeeld save() zou ik graag in die abstract method steken. Maar nu kom ik uit op een probleem.
Hoe kies ik dan bijvoorbeeld de juiste tabel als ik iets wil updaten?
En dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
return new \Whear\User\User($newData);


Hoe maak ik zoiets dynamisch als het in een abstract method staat?

Alvast bedankt.
 
PHP hulp

PHP hulp

28/11/2024 15:50:31
 
Jasper DS

Jasper DS

08/11/2012 21:35:37
Quote Anchor link
Hoi misschien kan je eens zien naar dit topic. Wouter legt hier mooi aan mij uit hoe je best met de mappers kunt werken.

Het voordeel van het systeem dat hij daar uitlegt is dat je makkelijk van database kunt switchen. Ik denk dat dat ik jouw geval niet lukt nu. Zeker eens bekijken!
 
- Raoul -

- Raoul -

08/11/2012 21:42:29
Quote Anchor link
Hey Jasper, ik had je topic al gezien maar het probleem is niet zo zeer dat ik zomaar van database kan switchen, meer hoe ik alles in één abstract class laat en dynamisch een User bijvoorbeeld laden (dus dat de abstract method niet alleen User kan inladen, maar bv. ook Message als dat moet, dynamisch.)
 
Jasper DS

Jasper DS

08/11/2012 21:53:42
Quote Anchor link
Kan je dat niet doen met de storage klassen uit mijn voorbeeld?
 
Wouter J

Wouter J

09/11/2012 10:18:29
Quote Anchor link
Je kan wel wat meer overhevelen naar de abstracte klasse, maar je moet alsnog je UserMapper behouden. Dat is namelijk een onderdeel van het DataMapper pattern: Per object heb je 1 speciale mapper.

Wat ik je kan aan raden is een populate method te maken de een array met data uit de database omzet in een object.
 



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.