Database klasse ontwerpen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Wouter J

Wouter J

09/07/2012 14:49:39
Quote Anchor link
Binnen een controller niet. Wel om je project heen om alle exceptions/errors op te vangen:
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
<?php
$exceptionHandler
= new ExceptionHandler();
$errorHandler = new ErrorHandler();
$mysqlErrorHandler = new MySQLErrorHanlder();

// vang alle fouten op met de ErrorHandler
set_error_handler(array($errorHandler, 'handle'));

try {
    // ... iets
} catch (Exception $e) {
    // Vang alle exceptions op met een ExceptionHandler
    $exceptionHanlder->handle($e);
}


if (mysql_connect(...)) {
    $mysqlErrorHanlder->handle(mysql_error());
}
 
PHP hulp

PHP hulp

28/11/2024 20:47:40
 
Write Down

Write Down

09/07/2012 22:23:48
Quote Anchor link
Okay, dat dacht ik zelf ook al :-).

Ik heb intussen even mijn UML geüpdatet. Nu vraag ik mij alleen af of het interessant is de class 'Result' te maken. Ik kan namelijk geen overeenkomstige methodes bedenken.

Verder bij de Controller, daar heb ik ook geen idee van welke methodes er altijd nodig zouden zijn.

Afbeelding
 
Wouter J

Wouter J

09/07/2012 23:24:13
Quote Anchor link
Quote:
Nu vraag ik mij alleen af of het interessant is de class 'Result' te maken. Ik kan namelijk geen overeenkomstige methodes bedenken.

Ja, een superklasse is altijd een goed idee ook als er geen overeenkomstige methods zijn. Maar de DataResult klasse kun je toch nog wel wat uitbreiden? Met een zoek method bijv (Seekable). En nog wel wat meer dingen.

Quote:
Verder bij de Controller, daar heb ik ook geen idee van welke methodes er altijd nodig zouden zijn.

Wel, kijk eens wat voor functies Symfony in zijn controller heeft:
http://api.symfony.com/master/Symfony/Bundle/FrameworkBundle/Controller/Controller.html
Of Zend Framework: http://framework.zend.com/apidoc/core/db_Zend_Controller_Action.html
Of die van Cake: http://api.cakephp.org/class/controller
 
Write Down

Write Down

09/07/2012 23:54:50
Quote Anchor link
Zou je dan ook de 'SeekableIterator' implementeren? Ik zou dan eerder gaan voor get($key) die dan de value of dergelijke teruggeeft. Veer meer functies dan een iterator en een getter kan ik werkelijk niet bedenken. Veel meer doe je toch met een query niet?

Toevoeging op 10/07/2012 14:15:43:

Laatste versie: Afbeelding
Gewijzigd op 10/07/2012 14:22:35 door Write Down
 
Wouter J

Wouter J

11/07/2012 13:20:26
Quote Anchor link
Je kan het natuurlijk zover uitbouwen als je wilt. Bijv. met nog een Countable interface en ga zo maar door. (deze countable interface kun je dan ook plaatsen bij de EditResult klasse, waardoor je getAffectedRows() kunt vergeten)

De query method van de DB klasse zou ik wat uitbreiden, zodat je kunt werken met prepared statements.

En je kan het natuurlijk nog mooier maken en er een ORM achtig iets van maken. waardoor je een entity (object) kan omzetten in een database result:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$user
= new User('Jasper');
$user->setAge(24);
$user->setEmail(...);
// ...

$orm = new ORM();
$orm->persist($user);
$orm->flush();
?>
 
Write Down

Write Down

11/07/2012 15:34:17
Quote Anchor link
Wat betreft prepared statements, dit was ik inderdaad vergeten. Ik denk dat ik dan ga gaan voor iets als volgt: query($query, array $params = null). Ik heb op internet wat liggen rond te kijken, er zijn er die nog tal van andere methodes hebben geïmplementeerd. Ik heb echter het gevoel dat ik die zelden / nooit nodig zal hebben. (vandaar deze simpele oplossing)

Ik ben nu even aan het kijken hoe dat ORM in zijn werk gaat :-)

Alweer, bedankt voor je bijdrage!


Toevoeging op 11/07/2012 15:43:30:

Even trouwens nog een update van mijn UML:
Afbeelding
 
Write Down

Write Down

17/07/2012 12:55:53
Quote Anchor link
Ik ben langzaam maar zeker bezig met alles om te zetten naar code. Nu ben ik bezig met de database klasse maar vraag me af of het wel allemaal goed is.

Ik geef dus, zoals je kan zien op mijn UML, een Config object mee. Met dat config object kan ik dus bv. de database-host opvragen en dergelijke. Zodanig dat ik iets als volgt kan doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
        $databaseConfig
= $this->getConfig()->get('database_settings');  //geeft een array terug
        //$host = $this->getConfig()->get('host');                                         //werkt ook eventueel        

        $this->databaseHandle = new \PDO('mysql:host='.$databaseConfig['host']);    //uiteraard alles invullen
?>


Alleen heb ik hier niet echt een lekker gevoel bij. Ik heb de indruk dat dit te hard-coded is. Graag jullie meningen!
Gewijzigd op 17/07/2012 12:56:18 door Write Down
 
Wouter J

Wouter J

17/07/2012 13:04:17
Quote Anchor link
Zo zou ik het ook doen. Al zou ik geen array teruggeven, maar een StdClass. Staat altijd wat mooier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$databaseConfig
= $this->getConfig()->get('database');
$this->databaseHandle = new \PDO('mysql:host='.$databaseConfig->host, ...);
?>
 
Write Down

Write Down

17/07/2012 15:23:56
Quote Anchor link
Dat is inderdaad wel een prettige manier!

Ik heb eigenlijk twee soorten 'mogelijkheden' betreft een get. Stel dat de volgende array in mijn config gebeuren zit zeg maar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$settings
= array('database' => array('host' => 'localhost', 'database' => 'test',  'user' => 'test', 'password' => 'haha'), 'website' => 'TestSite');
?>


Zou je het dan ook mogelijk maken om:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$config
->get('website');
echo $config->website;
?>


te gebruiken?
 
Write Down

Write Down

18/07/2012 15:28:33
Quote Anchor link
Bump
 

Pagina: « vorige 1 2



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.