[php] MVC controller benaderen vanuit andere Controll

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Freemann
  • Registratie: Januari 2002
  • Niet online

Freemann

CO2 Warmtepomp + VentilatieWTW

Topicstarter
Na alle feedback op mijn vorige topics ben ik overgestapt op een MVC pattern en probeer ik daar mijn weg in te vinden.

Nu ben ik al een eind gekomen om het principe van een MVC pattern te doorgronden, heb ik zelf een DB class toegevoegd en deze weten te benaderen (is misschien niet moeilijk voor andere maar voor mij is het allemaal nieuw).
Nu zit ik dat ik een 2de controller op heb gemaakt en deze werkt ook. Nu wil ik de outpot van deze controller gebruiken in een andere controller.

In de code heb ik een:
  • router
  • registry
  • models
  • views
nu heb ik 2 controllers;
indexController
kostenControler

In deze controllers zit zo ie zo een index functie en dan nog functies die je zelf aanmaakt.

Nu wil ik vanuit indexController de kostenController aanroepen maar dit lukt me niet.

Voor mijn gevoel zijn de registry.class en de router.class van belang voor mijn probleem en daarom
hieronder wat code en de foutmelding.

bij de volgende aanroep:
aanroep:
$registry = new registry;
$test = $registry->kostenController();

foutmelding:
Fatal error: Call to undefined method Registry::kostenController() in D:\.....\mvc_registraties\controller\indexController.php on line 233

aanroep:
$kosten = $this->registry->kostenController->index();

foutmelding:
Notice: Undefined index: kostenController in D:\......\mvc_registraties\application\registry.class.php on line 39

Fatal error: Call to a member function index() on a non-object in D:\......\mvc_registraties\controller\indexController.php on line 231

registry.php
PHP:
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
<?php

Class Registry {

 /*
 * @the vars array
 * @access private
 */
 private $vars = array();


 /**
 *
 * @set undefined vars
 *
 * @param string $index
 *
 * @param mixed $value
 *
 * @return void
 *
 */
 public function __set($index, $value)
 {
    $this->vars[$index] = $value;
 }

 /**
 *
 * @get variables
 *
 * @param mixed $index
 *
 * @return mixed
 *
 */
 public function __get($index)
 {
    return $this->vars[$index];
 }


}

?>


PHP:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php

class router {
 /*
 * @the registry
 */
 private $registry;

 /*
 * @the controller path
 */
 private $path;

 private $args = array();

 public $file;

 public $controller;

 public $action; 

 function __construct($registry) {
        $this->registry = $registry;
 }

 /**
 *
 * @set controller directory path
 *
 * @param string $path
 *
 * @return void
 *
 */
 function setPath($path) {

    /*** check if path i sa directory ***/
    if (is_dir($path) == false)
    {
        throw new Exception ('Invalid controller path: `' . $path . '`');
    }
    /*** set the path ***/
    $this->path = $path;
}


 /**
 *
 * @load the controller
 *
 * @access public
 *
 * @return void
 *
 */
 public function loader()
 {
    /*** check the route ***/
    $this->getController();

    /*** if the file is not there diaf ***/
    if (is_readable($this->file) == false)
    {
        $this->file = $this->path.'/error404.php';
                $this->controller = 'error404';
    }

    /*** include the controller ***/
    include $this->file;

    /*** a new controller class instance ***/
    $class = $this->controller . 'Controller';
    $controller = new $class($this->registry);

    /*** check if the action is callable ***/
    if (is_callable(array($controller, $this->action)) == false)
    {
        $action = 'index';
    }
    else
    {
        $action = $this->action;
    }
    /*** run the action ***/
    $controller->$action();
 }


 /**
 *
 * @get the controller
 *
 * @access private
 *
 * @return void
 *
 */
private function getController() {

    /*** get the route from the url ***/
    $route = (empty($_GET['rt'])) ? '' : $_GET['rt'];

    if (empty($route))
    {
        $route = 'index';
    }
    else
    {
        /*** get the parts of the route ***/
        $parts = explode('/', $route);
        $this->controller = $parts[0];
        if(isset( $parts[1]))
        {
            $this->action = $parts[1];
        }
    }

    if (empty($this->controller))
    {
        $this->controller = 'index';
    }

    /*** Get action ***/
    if (empty($this->action))
    {
        $this->action = 'index';
    }

    /*** set the file path ***/
    $this->file = $this->path .'/'. $this->controller . 'Controller.php';
}


}

?>


al met al snap ik niet hoe ik een andere controller aan kan roepen terwijl het wel lukt om de db class aan te roepen met de onderstaande code:
$results = $this->registry->db->query('select * from ......... ');

Wie kan mij verder helpen?

https://www.taltion.nl, https://www.trekhaakkoffer-huren.nl, https://www.fietsendrager-huren.nl, https://www.fietskar-huren.nl


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Even kort:
Controllers dienen geen output te hebben. Ze dienen alleen de interactie af te handelen tussen eindgebruiker en de modellen. En dat brengt me meteen dan ook op 't volgende punt: volgens mij wil jij hier gewoon je model voor aanroepen als je kosten moet ophalen. In je controller wil je dan zoiets:

PHP:
1
2
3
4
5
6
7
8
class MijnController extends ApplicationController {
    //....

    public function index() {
        $this->kosten = Kosten::find('all');
        // of $this->Kosten->find('all'); of $this->registry('Kosten')->find('all); als late static binding je niet ActiveRecord zo laat implementeren.
    }
}


Tot slot, pak een bestaand PHP MVC framework erbij ipv "nog een rails/struts clone" maken ;-)

Voor al het andere:

Afbeeldingslocatie: http://scglectures.unibe.ch/p2/wp-content/uploads/design-patterns-book-cover.png

En:
Afbeeldingslocatie: http://vig-fp.prenhall.com/bigcovers/0321127420.jpg

[ Voor 11% gewijzigd door prototype op 26-07-2009 18:38 ]


Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

Class Registry ?

Moet dat niet class registry zijn.

Je router komt trouwens rechtstreeks uit een boek, titel is me even ontschoten. (Hmm: PHP 5 Power Programming misschien ? ;-)) Volgens het voorbeeld uit dat boek hoef je je controller niet te registreren in je register, je router roept je controller aan. In je register kan je dan wel weer Database classes, templating (voor je views) etc registreren.

[ Voor 13% gewijzigd door sky- op 26-07-2009 19:12 ]

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 19-09 20:56
Zoals Prototype al aangeeft wil je waarschijnlijk de logica die je nu aanroept in je ene controller in een model stoppen. Daarnaast hoef je dat model dan helemaal niet aan te roepen vanuit de controller, maar gewoon vanuit de view.

Een controller gebruik je om user input af te handelen. Als er geen userinput is kan je in principe je controller leeglaten ;)

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • Freemann
  • Registratie: Januari 2002
  • Niet online

Freemann

CO2 Warmtepomp + VentilatieWTW

Topicstarter
sky- schreef op zondag 26 juli 2009 @ 19:12:
Je router komt trouwens rechtstreeks uit een boek, titel is me even ontschoten. (Hmm: PHP 5 Power Programming misschien ? ;-)) Volgens het voorbeeld uit dat boek hoef je je controller niet te registreren in je register, je router roept je controller aan. In je register kan je dan wel weer Database classes, templating (voor je views) etc registreren.
De source die ik gebruik komt van:
http://www.phpro.org/tuto...-View-Controller-MVC.html
en waar die hem vandaan hebben?! Dus zou zomaar kunnen dat die het uit een boek hebben :)
freakingme schreef op maandag 27 juli 2009 @ 02:55:
.....

Een controller gebruik je om user input af te handelen. Als er geen userinput is kan je in principe je controller leeglaten ;)
Kijk dat is een leuke een nuttige opmerking!

Ben zoekende en heb nog weinig gevonden over wat je nu in de M,V,C, 's zet.Nu ben ik weer een stapje verder :)

Denk dat ik maar is in een kast ga duiken om te kijken of er nog een patterns boek ligt van mijn opleiding om te zien of dat me nu wel kan boeien :):$

[ Voor 49% gewijzigd door Freemann op 27-07-2009 08:07 ]

https://www.taltion.nl, https://www.trekhaakkoffer-huren.nl, https://www.fietsendrager-huren.nl, https://www.fietskar-huren.nl

Pagina: 1