Model MVC: Database ophalen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Raoul -

- Raoul -

01/07/2012 23:55:02
Quote Anchor link
Hoi!

Ik ben bezig met een klein MVC frameworkje voor mijn eigen projecten en ik ben dus nu aangekomen bij models.

Wat zou ik doen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$model
->getDatabase()->query('..');
?>

Of:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$model
->database->query('..');
?>


Alvast bedankt
 
PHP hulp

PHP hulp

03/05/2024 02:53:04
 
Marco M

Marco M

02/07/2012 00:12:45
Quote Anchor link
De 2e optie. Je haalt geen database op, je voert een query uit op de database.
 
Erwin H

Erwin H

02/07/2012 08:51:55
Quote Anchor link
Geen van beide.

Als je het zo doet bepaalt de controller dus blijkbaar de query. Dat wil je niet. De controller vertelt alleen aan het model dat hij data nodig heeft. Hoe dat wordt opgehaald bepaalt het model zelf. Wat je dus zou moeten hebben is een functie die de data ophaalt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$model
->getUsers();
$model->getProjects();
$model->getPage();
?>

Hoe dat dan in het model verder wordt verwerkt doet niet terzake (voor deze aanroep).
 
John Cena

John Cena

02/07/2012 08:56:12
Quote Anchor link
Optie 1 kan ook prima, want getDatabase is gevuld met de te gebruiken database
 
Ykcin Ykcin

Ykcin Ykcin

02/07/2012 09:18:07
Quote Anchor link
Het uitvoeren van de queries zou ik in je model houden.
Zoals hieronder:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
//Model
public function GetUsers()
{
    $database->query('SELECT * FROM users');
}


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
//Controller
public function index()
{
    $this->model->GetUsers();
}


EDIT:
De controller is voornamelijk een tussenpersoon tussen de Model en de View.
Controller vraagt Data aan de Model
Controller stuurt Data door aan de View
Controller laad de View in
Gewijzigd op 02/07/2012 09:20:16 door Ykcin Ykcin
 
- Raoul -

- Raoul -

02/07/2012 10:40:00
Quote Anchor link
Nee, je moet toch een enige vorm van een database hebben in een model?
Anders kan je ook geen getUsers() doen. Dus ik heb het over IN de model
 
Erwin H

Erwin H

02/07/2012 10:46:46
Quote Anchor link
Waarom zouje IN het model nog de variabele $model aanroepen? Waarvandan wil je de door jou geposte code gebruiken?
 
Wouter J

Wouter J

02/07/2012 10:49:10
Quote Anchor link
Ik zou dan dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

class Post_Model extends RaoulFramework_Model
{
    public function getUsers()
    {

        $this->getDatabase()->query('SELECT name FROM users');
    }
}


?>
Gewijzigd op 02/07/2012 10:49:21 door Wouter J
 
- Raoul -

- Raoul -

02/07/2012 11:21:13
Quote Anchor link
@Erwin: Ja zie die $model gewoon als $this->

Bedankt voor je reactie Wouter, zo ga ik het doen ;)
Gewijzigd op 02/07/2012 11:21:28 door - Raoul -
 
Wouter J

Wouter J

02/07/2012 11:29:42
Quote Anchor link
Merk op dat een Model niet per se vanuit een database moet zijn, maar ook via bijv. een xml of yml file.

Je kan dus beter een adapter pattern gebruiken voor je basis models:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
RF_Model
RF_Model_Database extends RF_Model
RF_Model_File     extends RF_Model
RF_Model_File_Xml extends RF_Model_File
RF_Model_File_Yml extends RF_Model_File
...
Gewijzigd op 02/07/2012 11:30:00 door Wouter J
 
- Raoul -

- Raoul -

02/07/2012 11:41:41
Quote Anchor link
Ik doe het gewoon zo:
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
<?php

class Model
{
        private $database = null;

    public function __construct()
    {

        try
        {
            $this->database = new Database();
        }

        catch (Exception $e)
        {

            exit('Kon geen verbinding maken met de database.');
        }
    }

    
    public function getDatabase()
    {

        return $this->database;
    }

}

?>


En Database() is dan gewoon een PDO object
Gewijzigd op 02/07/2012 11:42:13 door - Raoul -
 
Wouter J

Wouter J

02/07/2012 12:02:20
Quote Anchor link
Hmm, even een paar tips:
- PDO is geen database, de naam getDatabase is dan een beetje misplaatst. PDO is een Data-access abstraction layer, verzin een leuke getter en je bent klaar.
- Het is handig als je PHPdoc gebruik voor je methods, het is dan in 1 keer duidelijk wat je teruggeeft en wat je verwacht.
- Prefix je klassenaam altijd met de projectnaam of een afkorting daarvan, zoals PSR-0 voorschrijft. Anders krijg je straks problemen als je per ongeluk nog iets Model noemt
- Maak een ExceptionHandler die de exceptions afhandelt, je moet dat niet doormiddel van een exit zomaar doen.
- Ik raad je echt aan het Adapter pattern te gebruiken, zal je in de toekomst veel handiger voorkomen dan wat je nu hebt.
- Waarom een eigen PDO object maken? Waarom niet gewoon new PDO() doen?
- Je moet altijd programmeren naar een interface, een superklasse. Dat zorgt voor flexibiliteit als je straks wil gaan uitbreiden. Het zal je in de toekomst helpen met het controleren of je wel een model hebt, enz.
 



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.