Beginnen met MVC

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom K

Tom K

25/02/2009 18:28:00
Quote Anchor link
Hallo,

Ik heb nu de basis van PHP wel gezien, en wil nu graag beginnen met het scripten in een MVC-pattern. Na de nodigde informatie verzameld te hebben, ben ik vandaag begonnen met het schetsen van de pattern. Ik wil graag voordat ik ga beginnen om het toe te passen graag weten of deze schets wel klopt, en dat ik het hele gebeuren wel begrepen heb. Daarom wil ik graag op/aanmerkingen over de onderstaande schets horen.

Tom

Afbeelding
 
PHP hulp

PHP hulp

24/11/2024 09:14:58
 
Han eev

Han eev

25/02/2009 18:37:00
Quote Anchor link
Ik vind het een beetje raar dat men allemaal de 'stap' maakt naar MVC. Het is een goed principe en eigenlijk ook redelijk logisch.
Je wilt graag de view scheiden van de model en je hebt dan een controller die de acties tussen model en view regelt. Eigenlijk super logisch, dus ja je opbouw klopt wat mij betreft wel. Alleen naar mijn idee moet je het je eigen maken, dus precies en exact mvc toepassen lijkt me dan ook niet nodig. Het is meer een logische stap naar verbetering. Je scheidt gewoon allerlei dingen.
Correct me if i'm wrong.
 
Nicoow Unknown

Nicoow Unknown

25/02/2009 18:48:00
Quote Anchor link
Het hele principe van MVC is eigenlijk dat het mogelijk word om met één Controller meerdere Views kan creëren en eventueel ook verschillende Models kan afhandelen.
Een View kan ook direct informatie uit de Model halen, maar dit mag alleen als het presentatie is van de data, dus geen bewerkingen daarop uitvoeren.
Een mooi voorbeeld is een paarden race wedstrijd.
Vooral waar dan op gegokt word.
- Aan het eind van de race heeft ieder paard een tijd gereden.
- De Controller krijgt deze gegevens binnen en verwerkt ze naar het model.
- De Controller vraagt deze gegevens weer op en verwerkt ze naar een presentabele manier.
- De ene view geeft alle tijden op een groot beeldscherm wat in de stadions hangt.
- Een andere View stuurt smsjes met alle tijden daarin.
- Nog een andere View geeft alles weer op een website

Zo krijg je dus dat je slechts 1 Model en 1 Controller nodig hebt, om een heel scala aan Views te creëren.
Dat is dus juist het groote voordeel aan MVC ten opzichte van de normale programmeer manier.
 
Tom K

Tom K

25/02/2009 18:50:00
Quote Anchor link
nico schreef op 25.02.2009 18:48:
Het hele principe van MVC is eigenlijk dat het mogelijk word om met één Controller meerdere Views kan creëren en eventueel ook verschillende Models kan afhandelen.
Een View kan ook direct informatie uit de Model halen, maar dit mag alleen als het presentatie is van de data, dus geen bewerkingen daarop uitvoeren.
Een mooi voorbeeld is een paarden race wedstrijd.
Vooral waar dan op gegokt word.
- Aan het eind van de race heeft ieder paard een tijd gereden.
- De Controller krijgt deze gegevens binnen en verwerkt ze naar het model.
- De Controller vraagt deze gegevens weer op en verwerkt ze naar een presentabele manier.
- De ene view geeft alle tijden op een groot beeldscherm wat in de stadions hangt.
- Een andere View stuurt smsjes met alle tijden daarin.
- Nog een andere View geeft alles weer op een website

Zo krijg je dus dat je slechts 1 Model en 1 Controller nodig hebt, om een heel scala aan Views te creëren.
Dat is dus juist het groote voordeel aan MVC ten opzichte van de normale programmeer manier.



hier ben ik het helemaal mee eens.

als ik jouw verhaal zo lees, zie ik dat het dus waarschijnlijk ook handig is om een connectie tussen het model & de view te maken??
 
Nicoow Unknown

Nicoow Unknown

25/02/2009 18:55:00
Quote Anchor link
Zo af en toe kan dat handig zijn.
Als je geen enkele vorm van wijzigen uitvoert op de opgehaalde gegevens, (tenzij in de sql zelf) dan is het toegestaan om direct in de view de gegevens op te halen.
Dus bijvoorbeeld het weergeven van een profiel, dan zou dit kunnen.
Maar al het reken en wijzig werk laat je over aan je controller.
MAAR, als diezelfde output in iedere view hetzelfde is, dan doe je het weer wel in de controller, omdat het toch niet veranderd.
 
Tom K

Tom K

25/02/2009 18:57:00
Quote Anchor link
nico schreef op 25.02.2009 18:55:
Zo af en toe kan dat handig zijn.
Als je geen enkele vorm van wijzigen uitvoert op de opgehaalde gegevens, (tenzij in de sql zelf) dan is het toegestaan om direct in de view de gegevens op te halen.
Dus bijvoorbeeld het weergeven van een profiel, dan zou dit kunnen.
Maar al het reken en wijzig werk laat je over aan je controller.
MAAR, als diezelfde output in iedere view hetzelfde is, dan doe je het weer wel in de controller, omdat het toch niet veranderd.


ok, dan zet ik er een pijltje bij

Afbeelding
Gewijzigd op 01/01/1970 01:00:00 door Tom K
 
Pim Vernooij

Pim Vernooij

25/02/2009 19:51:00
Quote Anchor link
Ik zou het woordje "Browser" veranderen in "Request", het 'entry-point' van je applicatie is namelijk niet per definitie een browser, maar start wel altijd via een Request.
 
GaMer B

GaMer B

25/02/2009 20:00:00
Quote Anchor link
Browser => Request
FrontController of Router (Router wordt toch wel vaker gebruikt eigenlijk).
 
PHP erik

PHP erik

25/02/2009 20:19:00
Quote Anchor link
Ik heb effe geen tijd om de reacties van mensen te lezen, maar je tweede plaatje klopt minder dan de eerste. Een Model mag nooit iets van de View weten. De pijl moet andersom; de View weet altijd van de Model. Hij moet immers weten wat hij moet weergeven. De Model staat verder los.

Browser -> FrontController -> Router -> Dispatcher -> Controller
Controller -> Model
Controller -> View
View -> Model
Model -> Database
Model -> Andere storages (XML, Webservice, etc)

Edit: reactie op Gamer: een Router en FrontController zijn twee totaal verschillende dingen. De FrontController gebruikt een router om je request om te zetten in een route, die vervolgens aan de Dispatcher wordt gegeven om naar de Controller te gaan.
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
 
GaMer B

GaMer B

25/02/2009 20:24:00
Quote Anchor link
Hmm, zover ik weet is er tussen Controller en Request een Router gereserveerd...
 
PHP erik

PHP erik

25/02/2009 20:27:00
Quote Anchor link
Die door de FrontController wordt gebruikt. De Router doet op zichzelf niet heel veel behalve routes bepalen.

Verder nog ter aanvulling op de afbeelding; de Model is niet je datamodel, het is je complete business logica (ook wel domain logic genoemd). Je Model is veruit je belangrijkste laag in de applicatie. Een Controller bevat inderdaad enkel applicatie logica.
 
Tom K

Tom K

26/02/2009 12:30:00
Quote Anchor link
ik heb even de frontcontroller gemaakt, klopt dit een beetje??
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
    /********************************************************
     *  _____             _    _                              *
     *    |  __ \           | |  | | Version 1 Beta            *                  
    *    | |  | | _____   _| |__| | ___  _   _ ___  ___         *
    *    | |  | |/ _ \ \ / /  __  |/ _ \| | | / __|/ _ \        *
    *    | |__| |  __/\ V /| |  | | (_) | |_| \__ \  __/        *
    *    |_____/ \___| \_/ |_|  |_|\___/ \__,_|___/\___|        *
    *                                                        *
    *    @version: 1                                            *
    *     @author: Tom Keim                                    *
    *     @copyright: (c) DevHouse                             *
    *********************************************************
    *********************************************************
    *    @file: FrontController.php                            *
    *    @description: The file with the FrontController         *
    *********************************************************/

    class FrontController
    {
        public function __construct()
        {

            if(isset($_SERVER['PATH_INFO']))
            {

                /* PATH_INFO  exists */
                $parts = explode('/', strtolower(trim($_SERVER['PATH_INFO'], '/'))); //Set PATH_INFO to array
                $controller = ( current ( $parts ) ) ? array_shift ( $parts ) : 'default'; //Set controller to controller name or default
                $action = (current ( $parts ) ) ? array_shift ( $parts ) : 'index';  //Set action to action name or index
                
            }
            else
            {
                /* PATH_INFO don't exists */
                $controller = 'default'; //Set $controller to default
                $action = 'index'; //Set action to index
            }
            
            $this->dispatch($controller, $action); //Dispatch
        }
        public function dispatch($controller, $action)
        {

            $controllerName = ucfirst($controller).'Controller'; //Set controllerName to the controller name.
            $actionName = ucfirst($action).'Action'; //Set Action name to the action name
            if(file_exists(Routes::controllers.$controllerName.'.php'))
            {

                /* The controller file exists */
                require_once(Routes::controllers.$controllerName.'.php'); //Require the Controller File
                if(class_exists($controllerName))
                {

                    /* The controller class exists */
                    if(in_array($actionName , get_class_methods($controllerName)))
                    {

                        /* The Controller Action  exists */
                        $controllerObject = new $controllerName(); //Start controller object
                        $controllerObject->$actionName(); //Start controller action
                    }
                    else
                    {
                        /* The Controller Action don't exists(404) */
                        throw new Exception('(CONTROLLERACTION):('.$controllerName.'):('.$actionName.')', 404); //Set error
                    }
                }

                else
                {
                    /* The controller class don't exists(404) */
                    throw new Exception('(CONTROLLERCLASS):('.$controllerName.')', 404); //Set error    
                }
            }

            else
            {
                /* The controller file don't exists(404) */
                throw new Exception('(CONTROLLERFILE):('.$controllerName.'):('.Routes::controllers.$controllerName.'.php)', 404); //Set error
            }
        }
    }
[
/code]
 



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.